Codeforces Round #253 (Div. 2) E. Artem and Array (思维)

来源:互联网 发布:幼儿园 知乎 编辑:程序博客网 时间:2024/05/21 17:39

题意:

给n个数,每次删除一个数,可以加上左右两边相邻数中较小数的值,如果左或右缺少相邻值,

则加上0。问他通过这种操作最大能得到的值。


算法:

思想参考的是点击打开链接


首先,如果是左右两个数均不比中间的数小(有一侧大于,一侧相等也可以),那么可以直接取中间的数,权值加上左右两侧的最小值,这样操作完成后,得到的数组,递增,递减,先增后减,最大的两个数是紧挨着的,一定取不到,能取到的是除去最大的两个数的其他所有的和


#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#define maxn 500100using 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;}


0 0
原创粉丝点击