大概意思就是说,每天画一条水平线(若与之前的重合则相当于线的数量不变,每天告诉你画的这条线上的线有多少条)。要每天这条线下的线的数量之和最小,求这个最小值。

题解:
首先分析得出要是线下数量最少,因为线上是定值,所以转而求每天线的总数最少。
设第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;
}