1. 程式人生 > 其它 >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; }