经过分析我们能发现, 如果对于一个a[ i ] <= a[ i + 1 ] && a[ i ] <= a[ i - 1 ]可以直接删掉。
最后剩下一个先增后减的序列, 除了最大的两个都能加上。
#include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PLL pair<LL, LL> #define PLI pair<LL, int> #define PII pair<int, int> #define SZ(x) ((int)x.size()) #define ull unsigned long long using namespace std; const int N = 5e5 + 7; const int inf = 0x3f3f3f3f; const LL INF = 0x3f3f3f3f3f3f3f3f; const int mod = 1e9 + 7; const double eps = 1e-8; const double PI = acos(-1); int n, a[N], que[N], top; LL ans; int main() { scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%d", &a[i]); que[++top] = a[1]; for(int i = 2; i <= n; i++) { while(top > 1 && que[top] <= que[top - 1] && que[top] <= a[i]) { ans += min(que[top - 1], a[i]); top--; } que[++top] = a[i]; } sort(que + 1, que + 1 + top); for(int i = 1; i <= top - 2; i++) ans += que[i]; printf("%lld ", ans); return 0; } /* */