大概意思就是说,每天画一条水平线(若与之前的重合则相当于线的数量不变,每天告诉你画的这条线上的线有多少条)。要每天这条线下的线的数量之和最小,求这个最小值。
题解:
首先分析得出要是线下数量最少,因为线上是定值,所以转而求每天线的总数最少。
设第i天,线上数为a[i],线下数为d[i],线总数为sum[i]。很明显sum[i] = a[i] + d[i] + 1。
限制条件:
1.sum[i] ≥ sum[i - 1] 2.sum[i] ≥ a[i] + 1 3.sum[i] ≤ sum[i - 1] + 1 -----> sum[i - 1] >= sum[i] + 1 (因为每天只能画一条线)
对于前两个条件,我们从左向右递推,可以求出每天满足条件的最小值。(此时不满足第三个条件。)如何处理第三个条件?我们会想到从右向左递推,如果sum[i] + 1<sum[i + 1],那么把sum[i]赋值为sum[i + 1],继续递推。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
int a[maxn], sum[maxn];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i <= n; i++) {
sum[i] = max(sum[i - 1], a[i] + 1);
}
for (int i = n - 1; i >= 1; i--) {
sum[i] = max(sum[i], sum[i + 1] - 1);
}
long long ans = 0;
for (int i = 1; i <= n; i++) {
ans += sum[i] - 1 - a[i];
}
cout << ans << endl;
return 0;
} 
京公网安备 11010502036488号