【链接】 我是链接,点我呀:)
【题意】
题意
【题解】
设第i天总共的线数为t[i]
水平线上线数为m[i]是固定的
水平线下的线数设为d[i]
则d[i]+m[i]+1=t[i]
也就是说问题可以转化为使得t[i]最小
我们可以列出关于t[i]的不等式
t[i]= max{t[i-1],m[i]+1} ···①
t[i]+1>=t[i+1] ,因为每天最多划一条线 ····②
对于①式,直接顺推就好
对于②式
我们用t[i]>=t[i+1]-1逆推
只要t[i]<t[i+1]-1那么就把t[i]扩大为t[i+1]-1
因为t[i]每次推的时候都在扩大,而且小于t[i+1]所以,①式的性质不会被破坏。
同时也能够使得每个t[i]的值都为最小的t[i+1]-1.
【代码】
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5;
int n;
int m[N+10],t[N+10],d[N+10];
int main(){
ios::sync_with_stdio(0),cin.tie(0);
cin >> n;
for (int i = 1;i <= n;i++) cin >> m[i];
for (int i = 1;i <= n;i++){
t[i] = max(t[i-1],m[i]+1);
}
for (int i = n-1;i >= 1;i--){
//t[i]+1>=t[i+1]
//t[i]>=t[i+1]-1
if (t[i]<t[i+1]-1){
t[i] = t[i+1]-1;
}
}
for (int i = 1;i <= n;i++){
d[i] = t[i]-m[i]-1;
}
long long ans = 0;
for (int i = 1;i <= n;i++){
ans = ans + d[i];
}
cout<<ans<<endl;
return 0;
}