EOJ 2377 Sequence

http://www.acm.cs.ecnu.edu.cn/problem.php?problemid=2377

 用一个单调递减栈来实现贪心的思路——先合并小的。

单调栈则是用来保存那些较大的(暂不该合并的)元素。

单调栈依然不会用。。

 

 1 #include<map>
 2 #include<set>
 3 #include<list>
 4 #include<cmath>
 5 #include<ctime>
 6 #include<queue>
 7 #include<stack>
 8 #include<cctype>
 9 #include<cstdio>
10 #include<string>
11 #include<vector>
12 #include<cstdlib>
13 #include<cstring>
14 #include<iostream>
15 #include<algorithm>
16 #define MAXN 1000005
17 #define INF 0x3f3f3f3f
18 using namespace std;
19 
20 int s[MAXN], top;
21 //单调递减栈
22 
23 int main()
24 {    
25     int n;
26     while(cin >> n){
27         top = -1;
28         s[++top] = INF;
29         long long ans=0;
30         for(int i=0; i<n; i++){
31             int x;
32             scanf("%d", &x);
33             if(x <= s[top]){
34                 s[++top] = x;
35             }
36             else{
37                 while(x>s[top-1]){
38                     ans += s[top-1];
39                     top --;
40                 }
41                 ans += x;
42                 s[top] = x;
43             }
44         }
45         while(s[top-1]!=INF){
46             ans += s[top-1];
47             top --;
48         }
49         printf("%I64d\n", ans);
50     }
51 
52     return 0;
53 }
View Code

 

posted on 2013-09-05 21:24  KimKyeYu  阅读(150)  评论(0编辑  收藏  举报

导航