题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_3_D
输入:\/和_
输出:积水总面积和每个水坑的面积
_可以无视,读入数据时:
\ 压入栈中
/ 检查栈中有没有\,如果有,差值就是面积,加起来
建一个栈,用于存水坑,一个配对的坑\/就把这个坑的积水面积存进去,存下每个的面积和起始坐标
下一个坑如果它的起始\比前一个坑的小,则合并这两个坑。
#include <iostream> #include <string> #include <cstdio> #include <vector> #include <stack> using namespace std; int main (){ char s; stack<int> A; stack<pair<int,int> > B; int i=0,j,ans=0,a; while(cin>>s){ if(s=='\\') A.push(i); else if(s=='/'&&!A.empty()){ j=A.top();A.pop(); a=i-j; ans+=a; while(!B.empty() && B.top().first>j){ a=a+B.top().second; B.pop(); } B.push(make_pair(j, a)); } i++; } cout<<ans<<endl; vector<int> X; int z; z=B.size(); for(int i =0;i<z;i++){ X.push_back(B.top().second); B.pop(); } cout<<X.size(); for(int i =X.size()-1;i>=0;i--){ cout<<" "<<X[i]; } cout<<endl; return 0; }
错点:
1.输出时,限制条件尽量都不要写B.size()这种形式,因为它随着容器的变化在变化,应该先建立一个变量做限制条件,比如
z=B.size(); for(int i =0;i<z;i++)以后写循环限制条件时,尽量不要选一个随着循环内内容变化的量做限制条件,可以先传给另一个变量,再限制。