题目描述

计算积水的面积。
输入
1行,用”\”和”/”表示斜面,用”_”表示平地。
输出
第1行输出总面积,第2行输出积水数量和各积水处的横截面积。
代码
#include<iostream>
#include<stack>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
stack<int> S1; // 储存"\"
stack<pair<int, int>> S2; //(该积水处最左侧"\"的位置,该积水处当前的面积)
char ch;
int sum = 0; // 总面积
for (int i = 0; cin >> ch; i++) {
if (ch == '\\') S1.push(i); // 如果ch是'\',就把ch放入S1中。
else if (ch == '/' && !S1.empty()) { // 否则如果ch是'/'并且S1中还存有'\',
int j = S1.top();
S1.pop(); // 把S1中的第一个'\'取出来。
sum += i - j; // i-j是这两个'\'和'/'形成的梯形的面积。
int a = i - j;
while (!S2.empty() && S2.top().first > j) {
a += S2.top().second;
S2.pop();
}
// 如果j代表的"\"的位置小于当前S2最上面"\"的位置,说明S2最上面"\"不是最左侧的,
// 说明这对j代表的"\"和i代表的'/'已经和之前的积水处一起形成了一个更大的积水处。
S2.push(make_pair(j, a));
}
} // 现在S2中储存的是一个个积水处
vector<int> ans;
while (!S2.empty()) // 把S2复制到ans中去
ans.push_back(S2.top().second);
S2.pop();
reverse(ans.begin(), ans.end()); // 把ans翻转
cout << sum << endl << ans.size();
for (int &e : ans) cout << " " << e;
cout << endl;
}