其他分享
首页 > 其他分享> > D-Circular Addition

D-Circular Addition

作者:互联网

题目链接

思路

我们需要把数组从0变成他给出的数组,不妨考虑把他给的数组变成全是0,因为全是0,原数组的数相等,所以差分数组最后全是0,我们要把他的差分变0,

他是一个环(因为 j 超过 n 就变成 1 ),所以差分数组的正数和等于负数和,因为我们本来需要对原数组进行+1的操作,但是我们可以转化思维对他给出的数

组进行-1的操作使他变成0,当我们对他l-r的区间进行减1的操作时差分数组就会进行一个 b[ l ]-1,b [r+1]+1 的操作,因为 l r  是我们任意选的,所以我们只

用操作差分的正数之和个操作就可以让原数组一样(选一个正数-1,选一个负数+1),但是当最小的值太大的时候我们把差分数组变成0之后只是让他们变成了

一样的数,还需要把操作之后的n个相同的数x操作x下减到0,根据贪心的思想我们每次操作势必会对max(a[i])操作,假设操作了o次,操作之后的数再变成0所

需要的操作数h加上o肯定还是max(a[i]),我们把max(a[i])和把差分数组变成0所进行的con次操作数做比较,取最大值:如果max(a[i])>con说明他经过con次操

作只是把原数组变成了一样的数而没有变成零,所以总共需要进行max(a[i])次操作,如果con>max(a[i])说明经过con次操作不仅原数组的数一样而且等于0。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2000000;
ll s[N];
int main()
{
    int n;
    cin >> n;
    ll ans = 0;
    cin >> s[1];
    ll mas = s[1];
    for (int i = 2; i <= n; i++)
    {
        cin >> s[i];
        if (s[i] - s[i - 1] > 0)
            ans += s[i] - s[i - 1];
        mas = max(mas, s[i]);
    }
    if (s[1] - s[n] > 0)
        ans += s[1] - s[n];
    cout << max(ans, mas);
    return 0;
}

 

标签:Addition,max,差分,数组,操作,变成,con,Circular
来源: https://www.cnblogs.com/gosick-ll/p/16098831.html