ALDS1_3_D: Areas on the Cross-Section Diagram
题目摘要
计算积水的面积。
输入
1行,用”\”和”/”表示斜面,用”_”表示平地。
程序:
//#include <bits/stdc++.h>
//using namespace std;
//
//int main()
//{
// vector<int> V;
// for (int i=0; i<5; i++){
// V.push_back(i);
// }
// for (int i=0; i<5; i++){
// cout<<V[i]<<" ";
// }
// cout<<endl;
// reverse(V.begin(), V.end());
// for (int i=0; i<5; i++){
// cout<<V[i]<<" ";
// }
// return 0;
//}
#include <bits/stdc++.h>
using namespace std;
//样例:\\///\_/\/\\\\/_/\\///__\\\_\\/_\/_/\
int main(){
stack<int> index;
stack<pair<int, int> > area;
char ch;
int sum = 0;
for (int i=0; cin>>ch; i++){
if (ch == '\\') index.push(i);
else if (ch == '/'&&index.size()>0){
int j = index.top();
index.pop();
int s = i-j;
sum += s;
while(area.size()>0&&area.top().first>j){
s += area.top().second//修改前面的记录的下标和对应的面积,看p87就能明白这个while循环的意义了!!
area.pop();
}
area.push(make_pair(j, s));
//cout<<s<<" ";
}
}
//cout<<endl;
vector<int> ans;
while(!area.empty()){
ans.push_back(area.top().second);
area.pop();
}
reverse(ans.begin(), ans.end());//翻转整个vector,注意这个一定要是个可迭代的对象。如果是数组,和swap()效果一样
cout<<sum<<endl;
cout<<ans.size()<<" ";
for(int i=0; i<ans.size(); i++){
cout<<ans[i]<<" ";
}
}