CodeForces 442C Artem and Array(贪心)

E - Artem and Array

Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d
& %I64u

Submit Status

Appoint description: 
System Crawler  (2014-08-21)

Description

Artem has an array of n positive integers. Artem decided to play with it. The game consists of n moves.
Each move goes like this. Artem chooses some element of the array and removes it. For that, he gets min(a,?b) points, where a and b are
numbers that were adjacent with the removed number. If the number doesn‘t have an adjacent number to the left or right, Artem doesn‘t get any points.

After the element is removed, the two parts of the array glue together resulting in the new array that Artem continues playing with. Borya wondered what maximum total number of points Artem can get as he plays this game.

Input

The first line contains a single integer n(1?≤?n?≤?5·105) — the number of
elements in the array. The next line contains n integersai(1?≤?ai?≤?106) —
the values of the array elements.

Output

In a single line print a single integer — the maximum number of points Artem can get.

Sample Input

Input

5
3 1 5 2 6

Output

11

Input

5
1 2 3 4 5

Output

6

Input

5
1 100 101 100 1

Output

102

题目大意:给出一个数组,每次操作可以删除一个数,得到这个数左右两个数的最小值的权值(如果左右两侧不全,权值为0),问最大得到多少?

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

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
using namespace std;
#define LL __int64
LL p[600000] , top ;
int main()
{
    LL i , x , n , ans ;
    top = -1 ; ans = 0 ;
    scanf("%I64d", &n);
    while(n--)
    {
        scanf("%I64d", &x);
        while( top >= 1 && p[top] <= p[top-1] && p[top] <= x )
        {
            ans += min( p[top-1],x );
            top-- ;
        }
        p[++top] = x ;
    }
    sort(p,p+(top+1));
    for(i = 0 ; i < top-1 ; i++)
        ans += p[i] ;
    printf("%I64d\n", ans);
    return 0;
}
时间: 2024-12-28 09:45:39

CodeForces 442C Artem and Array(贪心)的相关文章

Codeforces 442C Artem and Array(stack+贪心)

题目连接:Codeforces 442C Artem and Array 题目大意:给出一个数组,每次删除一个数,删除一个数的得分为两边数的最小值,如果左右有一边不存在则算作0分.问最大得分是多少. 解题思路:首先将连续的a,b,c,a > b && c > b的情况将c掉,获得min(a,b)分,这样处理后数组变成一个递増再递减的序列,除了最大和第二大的取不到,其他数字均可以得分. 样例:4 10 2 2 8 #include <cstdio> #include

[CF442C] Artem and Array (贪心+单调栈优化)

题目链接:http://codeforces.com/problemset/problem/442/C 题目大意:一个数列,有n个元素.你可以做n-2次操作,每次操作去除一个数字,并且得到这个数字两边相邻的数最小的分数.问你最多得到多少分. 将高度绘图,去除V的情况. 用单调栈优化,每个元素进栈一次,出栈一次.线性时间. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include

codeforces 442C C. Artem and Array(有深度的模拟)

题目 感谢JLGG的指导! 思路: //把数据转换成一条折线,发现有凸有凹 //有凹点,去掉并加上两边的最小值//无凹点,直接加上前(n-2)个的和(升序)//数据太大,要64位//判断凹与否,若一边等于,一边大于,那中间这个也算是凹进去的,所以判断时要加上等于 //有凹点,去掉并加上两边的最小值 //无凹点,直接加上前(n-2)个的和(升序) //数据太大,要64位 //判断凹与否,若一边等于,一边大于,那中间这个也算是凹进去的,所以判断时要加上等于 #include<stdio.h> #i

[2016-04-09][codeforces][660][A][ Co-prime Array]

时间:2016-04-09 22:50:56 星期六 题目编号:[2016-04-09][codeforces][660][A][ Co-prime Array] 题目大意:给定一个数列,问至少需要插入多少个1 1091 109中的任一数字,才能使得相邻两个数字是互质的,输出最少次数和最后的数列 分析:直接扫一遍,相邻元素不互质的,中间插个1, #include<cstdio> #include<vector> using namespace std; const int maxn

Codeforces 442B Andrey and Problem(贪心)

题目链接:Codeforces 442B Andrey and Problem 题目大意:Andrey有一个问题,想要朋友们为自己出一道题,现在他有n个朋友,每个朋友想出题目的概率为pi,但是他可以同时向多个人寻求帮助,不过他只能要一道题,也就是如果他向两个人寻求帮助,如果两个人都成功出题,也是不可以的. 解题思路:贪心,从概率最大的人开始考虑,如果询问他使得概率变大,则要询问. #include <cstdio> #include <cstring> #include <a

Educational Codeforces Round 21 D. Array Division

题目链接:Educational Codeforces Round 21 D. Array Division 题意: 给你n个数,现在你可以改变1<=个数的位置,然后问你是否存在有一个k,使得sum(a[i])(1<=i<=k)==sum(a[j])(k+1<=j<=n) 题解: 分析: 如果需要将一个数移动,无非就是将这个数从第一部分移到第二部分,或者从第二部分移到第一部分. 所以,我们只需要开两个map来记录一下两部分有哪些数. 当两部分的差值/2等于其中一部分的一个数时

Codeforces Round #300-Tourist&#39;s Notes(贪心)

Tourist's Notes Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Description A tourist hiked along the mountain range. The hike lasted for n days, during each day the tourist noted height above the sea level

CodeForces 451B Sort the Array

Description Being a programmer, you like arrays a lot. For your birthday, your friends have given you an array a consisting of n distinct integers. Unfortunately, the size of a is too small. You want a bigger array! Your friends agree to give you a b

Codeforces 432E Square Tiling(构造+贪心)

我们通常这么写 using (SqlDataReader drm = sqlComm.ExecuteReader()) { drm.Read();//以下把数据库中读出的Image流在图片框中显示出来. MemoryStream ms = new MemoryStream((byte[])drm["Logo"]); Image img = Image.FromStream(ms); this.pictureBox1.Image = img; } 我的写数据 private void b