题目链接: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++)
以后写循环限制条件时,尽量不要选一个随着循环内内容变化的量做限制条件,可以先传给另一个变量,再限制。