正题
题目链接:https://www.luogu.com.cn/problem/CF442C
题目大意
nnn个数,删除一个数可以获得左右两边最小值的价值,求删除所有数的最大价值。
解题思路
对于一个位置如果它左右两边都比它高那么这个位置一定删除,然后序列会呈一个单峰状,我们除了最大的和次大的都可以选到。时间复杂度O(nlogn)O(n\log n)O(nlogn)
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=5e5+10;
ll n,cnt,a[N],ans;
int main()
{scanf("%lld",&n);for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);for(ll i=1;i<=n;i++){while(cnt&&a[cnt-1]>=a[cnt]&&a[i]>=a[cnt])ans+=min(a[cnt-1],a[i]),cnt--;a[++cnt]=a[i];}sort(a+1,a+1+cnt);for(ll i=cnt-2;i>=1;i--)ans+=a[i];printf("%lld",ans);
}