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 ", ans); 50 } 51 52 return 0; 53 }