大概意思就是说,每天画一条水平线(若与之前的重合则相当于线的数量不变,每天告诉你画的这条线上的线有多少条)。要每天这条线下的线的数量之和最小,求这个最小值。
题解:
首先分析得出要是线下数量最少,因为线上是定值,所以转而求每天线的总数最少。
设第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; }