第十五屆中北大學算法與程序設計競賽(公開賽)C.港口

第十五屆中北大學算法與程序設計競賽(公開賽)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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章