其他分享
首页 > 其他分享> > C. Helping the Nature #802 div2

C. Helping the Nature #802 div2

作者:互联网

Problem - C - Codeforces

这个题说实话看完题目第一眼反应的就是差分,还是不擅长英文题目吗?当时一个劲的翻译,翻译完只是了解了一下题目意思,把重要信息都漏了,还是要多多注意一下

连续的某一段同时+d或者-d,这首先就应该要想到差分,然后差分数组构造出来之后,因为最后统统变成0,所以连同b[1]也要变成0

那具体怎么变呢

根据题意:

操作1:d[1]-1   d[i+1]+1

操作2:d[i]-1    d[n+1]+1

操作3:d[1]+1   d[n+1]-1

差分数组说实话b[n+1]这个可以随便用,前面的都是0即可

所以,到这里还不会吗?我还真不会QAQ

举个栗子:

10 4 7

10 -6 3

从后往前枚举,这样不会有影响,3—>0,必定是减3,可以进行操作2(对后缀进行操作),然后在总次数上+3

-6—>0 需要+6,这是某一前缀啊,可以是操作1,不过这里的b[1]要进行变化(其实操作几都可以,我们需要选一个最优的)

然后到最后了b[1]要变成0,所以总次数+abs(b[1])就是答案了

#include<iostream>
#include<cstdio>
using namespace std;
const int N=2e5+10;
typedef long long ll;
ll a[N],b[N];
int main(){
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            b[i]=a[i]-a[i-1];
        }
        ll sum=0;
        for(int i=n;i>=2;i--)
        {
            if(b[i]>0) sum+=b[i];
            else if(b[i]<0)
            {
                sum-=b[i];
                b[1]+=b[i];
            }
        }
        cout<<abs(b[1])+sum<<"\n";
    }
    return 0;
}

 

标签:10,题目,int,ll,差分,Helping,操作,802,div2
来源: https://www.cnblogs.com/ccwz7/p/16395951.html