題面傳送門
這道題首先要有乙個思維的轉換:對於選擇滿足0≤i
<
n0\leq i< n
0≤i<
n 的任意下標i
ii ,並讓a
aa陣列裡下標為i
ii處的值變為sum
sumsu
m。把賦值的思維轉化成選擇乙個下標,把除了這個下標的所有值加到它身上
這道題正著想很難想,俗話說得好,正難則反,所以我們不如倒著做
對於已經構造好的a
aa序列,首先我們要確定它最後修改的位置。很明顯,最後修改的位置是最大的,那麼我們要計算它修改前的值,我們的思維轉換就要派上用場了,其他值是不變的,所以我們維護乙個總值,算出其他值,在這個數上減去就好了,一直到所有數都為1
11或有的數<
1<1
<
1為止。
對於找最大值的過程,我們可以用乙個大根堆維護。
#include
using
namespace std;
long
long n,m,tot,a[
100039
],b[
100039
],sum,ans,pus,sss;
priority_queue<
long
long
,vector<
long
long
>
,less<
long
long
>
> s;
intmain()
if(tot==n)
printf
("t");
else
printf
("n");
}
但這樣有乙個問題,有幾組hac
khack
hack
資料跑不過去。比如下面這組:
2
11000000000
我們發現重複減了很多次,我們可以計算出它要減幾次,然後一併減掉。我們把這個元素拿出來,再取出乙個堆頂的值,然後將他們兩個作差後的結果除以減去的值向下取整再+1+1
+1,這就是要減的次數,用乘法一併減掉就可以了
ac**:
#include
using
namespace std;
long
long n,m,tot,a[
100039
],b[
100039
],sum,ans,pus,sss,now;
priority_queue<
long
long
,vector<
long
long
>
,less<
long
long
>
> s;
intmain()
ans=sum-pus;
now=s.
top();
sum-=(
(pus-now)
/ans+1)
*ans;
pus-=(
(pus-now)
/ans+1)
*ans;
if(pus==
1) tot++
;else
if(pus<1)
break
;else s.
push
(pus);}
if(tot==n)
printf
("t");
else
printf
("n");
}
還有,不開lon
glon
glong long
longlo
ng見祖宗啊!!!
156 合併區間
5.3 本來以為是排好序的區間,後來發現不是。definition of interval public class interval class solution for int i 0 i intervals.size 1 i if tmp1.start tmp2.end tmp1.start ...
1 5 6 泛型方法
除了定義泛型類,泛型結構外,還可以定義泛型放啊發,泛型方法可以在泛型型別定義 也可以在非泛型類中定義。下面是定義的乙個泛型方法,該泛型型別用於兩個引數。前面有介紹ref關鍵字 void swap ref t x,ref t y 通過傳入型別來呼叫泛型類 int i 4 int j 5 swap re...
qzezoj 1540 糖果峽谷
題面傳送門 三十分 於是我只能重新想思路。然後就只得了35 3535 分。考試結束後老師叫我們自己去網上找題解,然而我發現,居然沒有任何一篇luo gu luogu luog u題解是正解。於是我準備發一篇題解來k kk掉luo gu luogu luog u所有題解。正解 我們先把這個峽谷想象成乙...