题意
给出一个数组,你可以对这个数组中的每一个元素进行增加,任务是,让其变成一个先递增后递减,(严格递增递减,即元素互不相等,可以只递增或者只递减),求出增加总数的最小值
思路
做一个满足递增的最小花费的前缀和数组,同样做一个后缀和,最后遍历,前后加起来取最小值,注意如果左右的改变后的元素相同还需要加一,所以要用两个数组记录一下改变后的元素
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100100], sumq[100100], sumh[100100], b[100100], d[100100];
int main() {
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%lld", &a[i]);
if(!i) {
b[i] = a[i];
}
if(i) {
if(b[i-1] >= a[i]) {
b[i] = b[i-1] + 1;
} else {
b[i] = a[i];
}
sumq[i] = sumq[i-1] + b[i] - a[i];
}
}
for(int i = n - 1; i >= 0; i--) {
if(i == n - 1) {
d[i] = a[i];
}
if(i != n - 1) {
if(d[i+1] >= a[i]) {
d[i] = d[i+1] + 1;
} else {
d[i] = a[i];
}
sumh[i] = sumh[i+1] + d[i] - a[i];
}
}
ll ans = sumq[0] + sumh[1] + 1;
for(int i = 0; i < n; i++) {
if(b[i] == d[i+1]) {
ans = min(ans, sumq[i] + sumh[i+1] + 1);
} else {
ans = min(ans, sumq[i] + sumh[i+1]);
}
}
cout << ans << endl;
}