题目链接:https://ac.nowcoder.com/acm/contest/5188/C
题目大意:长度为n的数列,每次可以选择一个区间,使区间的每一个数+1或-1
问最少几次操作后,所有的数相等。
题解:差分
当所有的数都相等后,差分数组除了第一个数都为0.
当给区间[L,R]中的每个数+1,即将差分数组cf[L]++,cf[R+1]--,
当给区间[L,R]中的每个数-1,即将差分数组cf[L]--,cf[R+1]++,
所以本题转换为对差分数组执行最少的操作次数,使差分数组除第一个数都变为0.
当给差分数组中正的-1时,就对差分数组中负的+1,这样操作次数最少。
结果为 差分数组中负数的和 与 正数的和绝对值大的为答案。
代码
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define N 100009 #define LL long long using namespace std; int n; LL w[N]; LL gg,pp; int main() { scanf("%d",&n); cin>>w[1]; if(n==1) { if(w[1]>0) cout<<w[1]; else cout<<-1*w[1]; return 0; } for(int i=2;i<=n;i++) { scanf("%lld",&w[i]); LL c=w[i]-w[i-1]; if(c>0) gg+=c; else pp-=c; } cout<<max(gg,pp); return 0; } /* 5 4 0 -2 -1 5 3 0 -1 -1 5 2 0 0 -1 5 1 0 0 0 5 0 0 0 0 */