第十五屆中北大學算法與程序設計競賽(公開賽)C.港口
題目描述
港口有n堆貨物,他們的重量分別爲w1,w2,…wn,每堆貨物的重量不一定相同。吊車師傅每次操作可以使任意第i堆到第j堆的貨物都增加一個重量或者減少一個重量。請問吊車師傅最少需要執行幾次操作可以使n堆貨物重量都相同。
輸入描述:
第一行輸入正整數n。
第二行輸入n個整數,第i個整數表示wi。
數據範圍:
0 < n < 100000;
0 <= wi <= 1000000000;
輸出描述:
第一行輸出最少操作次數。
示例1
輸入
5
0 1 1 1 0
輸出
1
這題本來是個差分題,但是我在看別人代碼時發現了一個大佬的解法,真的厲害(๑•̀ㅂ•́)و✧
我們可以通過計算髮現,一個數組所有數調整成一樣大,所需的次數恰爲所有相鄰數差的和的最大值,emmm,我也不知道怎麼證明,反正應該是個定理,AC代碼如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
main(){
ll n,k,x,cnt1=0,cnt2=0;
cin>>n>>k;
for(ll i=1;i<n;i++){
cin>>x;
if(x-k>0) cnt1+=x-k;
else cnt2+=k-x;
k=x;
}
cout<<max(cnt1,cnt2);
}