Artem and Array CodeForces - 442C (贪心)

时间:2023-03-08 23:18:14
Artem and Array CodeForces - 442C (贪心)

大意: 给定序列$a$, 每次任选$a_i$删除, 得分$min(a_{i-1},a_{i+1})$(无前驱后继时不得分), 求最大得分.

若一个数$x$的两边都比$x$大直接将$x$删除, 最后剩余一个先增后减的序列, 然后按从大到小顺序删除

#include <iostream>
#include <algorithm>
#include <math.h>
#include <cstdio>
#include <vector>
#include <string.h>
#include <queue>
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define REP(i,a,n) for(int i=a;i<=n;++i) using namespace std;
const int N = 2e6+10;
int a[N], b[N], f[N], n, m, k;
int q[N]; int main() {
scanf("%d", &n);
REP(i,1,n) scanf("%d", a+i);
ll ans = 0;
REP(i,1,n) {
while (*q>1&&q[*q]<=a[i]&&q[*q]<=q[*q-1]) {
ans += min(q[--*q], a[i]);
}
q[++*q] = a[i];
}
sort(q+1,q+1+*q);
REP(i,1,*q-2) ans += q[i];
printf("%I64d\n", ans);
}