题目:点此

思路:{

利用单调递减栈,每压一个元素,弹出的元素都向它发射过能量,弹完后的栈顶接受过它的能量。

把每个元素收集的能量统计起来,找最大值输出。

犯的错误:{

1.偷懒搞文件输入输出后没去掉。

2.一些类型用错了(应long long用int)。

3.没考虑栈空的情况。

}

收获:{

1.为避免错,整数用long long,小数用double。

2.要考虑周全,不要想当然。

3.不是CSP-J/S考试,不要用文件输入输出。

}

 1 //#include <iostream>
 2 #include <stack>
 3 #include <cstdio>
 4 #include <vector>
 5 using namespace std;
 6 stack <int> number;
 7 vector <int> v,h;
 8 vector <long long> vs;
 9 int main(){
10     int n;
11 //    freopen("13.txt","r",stdin);
12     scanf("%d",&n);
13     for(int i=0;i<n;i++){
14         long long sum=0;
15         int hi,vi;
16         scanf("%d %d",&hi,&vi);
17         h.push_back(hi);
18         v.push_back(vi);
19         while(!number.empty()&&h[number.top()]<hi){
20             sum+=v[number.top()];
21             number.pop();
22         }
23         if(!number.empty()){
24             vs[number.top()]+=vi;
25         }
26         number.push(i);
27         vs.push_back(sum);
28     }
29     long long m=0;
30     for(int i=0;i<n;i++){
31         if(m<vs[i]){
32             m=vs[i];
33         }
34     }
35     printf("%lld",m);
36     //fclose(stdin);
37     return 0;
38 }
posted on 2020-01-12 16:12  eason66  阅读(188)  评论(0编辑  收藏  举报