题目:点此
思路:{
利用单调递减栈,每压一个元素,弹出的元素都向它发射过能量,弹完后的栈顶接受过它的能量。
把每个元素收集的能量统计起来,找最大值输出。
}
犯的错误:{
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 }