标签:Addition max 差分 数组 操作 变成 con Circular
思路
我们需要把数组从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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。