大致講一下題意,給乙個陣列,讓我用最少的次數將這個陣列重置為相同的值,也就是陣列內所有數字大小必須相同,而每一次操作僅允許對乙個區間進行+1或者-1的操作。
區間修改,而且是修改相同的值,就讓我想到了差分陣列,差分陣列不熟悉的讓每乙個值都相同其實就是讓差分陣列從第二個開始都為0!當從第二個開始都為0時那麼整個陣列都會變成第乙個值的大小。
那麼首先就先將這一題所給原陣列轉化為差分陣列,然後計算從第二個位置開始陣列元素全部轉化為0的步數。這裡可以逆向思考,從0恢復到原陣列元素的步數就是題目所問的最少步數,而恢復原陣列的最快步數就是ans=max(正數之和,負數之和的絕對值);解釋一下:因為差分陣列每一次變化都會產生一對相反數,而那麼我只需要注意絕對值大的就行了,至於多出來的正數或者負數其實是可以放在最後的也就是n+1或者放到第乙個位置(這裡一開始沒有運算!)的位置。至此步數就解決了!!!
現在解決有多少種的問題:首先我之前說了一句,在經過最少次數變化以後,整個陣列都會變成第乙個數字的值,那麼種類個數只需要考慮一下第乙個數字有多少種可能就行了!在之前說過可以放第乙個位置,為什麼呢,因為放到這裡可以改變整個陣列的值,也就是中間可以放多少個,就可以改變多少次,所以答案就是(正數-負數)的絕對值+1
#include#includeusing namespace std;
int main()
int c[100009],ko=a[1];
for(i=2;i<=n;i++)
//差分陣列
long long sum2=0,sum1=0,maxx=0,minn=c[1];
for(i=2;i<=n;i++)
printf("%lld\n",max(sum1,sum2));
printf("%lld\n",abs(sum1-sum2)+1);
}
IncDec序列 差分
給定乙個長度為 n 的數列 a1,a2,an每次可以選擇乙個區間 l,r 使下標在這個區間內的數都加一或者都減一。求至少需要多少次操作才能使數列中的所有數都一樣,並求出在保證最少次數的前提下,最終得到的數列可能有多少種。第一行輸入正整數n。接下來n行,每行輸入乙個整數,第i 1行的整數代表ai。第一...
IncDec序列(差分 貪心)
原題鏈結 題目大意 給定乙個序列,可以在其連續子串行上進行加一或者減一操作,求使整個序列變成相同數的最小運算元和種數。思路首要要明確是對 l,r 序列進行加一或者減一操作,可以聯想到字首和,我們對乙個陣列b的第l項進行減一操作,第r 1項進行加一操作,這樣作用到b陣列的字首和序列就是連續的區間段 l...
IncDec序列 差分 貪心
給定乙個長度為 n 的數列 a1,a2,an 每次可以選擇乙個區間 l,r 使下標在這個區間內的數都加一或者都減一。求至少需要多少次操作才能使數列中的所有數都一樣,並求出在保證最少次數的前提下,最終得到的數列可能有多少種。第一行輸入正整數n。接下來n行,每行輸入乙個整數,第i 1行的整數代表ai。第...