题意:
给n个数,每次删除一个数,可以加上左右两边相邻数中较小数的值,如果左或右缺少相邻值,
则加上0。问他通过这种操作最大能得到的值。
算法:
思想参考的是点击打开链接
首先,如果是左右两个数均不比中间的数小(有一侧大于,一侧相等也可以),那么可以直接取中间的数,权值加上左右两侧的最小值,这样操作完成后,得到的数组,递增,递减,先增后减,最大的两个数是紧挨着的,一定取不到,能取到的是除去最大的两个数的其他所有的和
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define maxn 500100
using namespace std;
typedef long long ll;
ll p[maxn];
int n;
int main()
{
ll x,ans;
while(scanf("%d",&n)!=EOF)
{
int top = -1;
ans = 0;
for(int i=1;i<=n;i++)
{
scanf("%I64d",&x);
while(top>=1 && p[top-1]>=p[top] && x>=p[top])
{
ans+=min(p[top-1],x);
top--;
}
p[++top] = x;
}
sort(p,p+(top+1));
for(int i=0;i<top-1;i++)
ans+=p[i];
printf("%I64d\n",ans);
}
return 0;
}