第十五届中北大学算法与程序设计竞赛(公开赛)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
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);
}

你可能感兴趣的:(思维,差分,牛客)