C港口 (差分数组)(第十五届中北大学算法与程序设计竞赛)

题目链接: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
*/ 
View Code
原文地址:https://www.cnblogs.com/zzyh/p/14479717.html