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