你的任务是模拟洪水灾害。
对于给定的横截面图,给出淹没部分的面积。
假设该地区不断地下雨,而从该地区溢出的水正在落入两侧的海中。 例如,对于上面的横截面图,雨水将产生洪水,其面积分别为 4、2、1、19 和 9。
输入
在一行中给出一个字符串,分别用/,\和_
表示斜坡和平原。
例如,上面例子的区域由字符串“\ \ / / / \ _ / \ / \ \ \ \ / _ / \ \ / / / _ _ \ \ \ _ \ \ / _ \ / _ / ”给出。
输出
按以下格式输出:
A K
L1,L2,…,Lk
在第一行,打印出洪水区域的总面积A。
在第二行,打印出洪水区域的个数K和每个区域的面积Li(从左到右)。
约束
1 ≤ length of the string ≤ 20000
输入样例
\\///\_/\/\\\\/_/\\///__\\\_\\/_\/_/\
输出样例
35
5 4 2 1 19 9
C++直接用栈类太方便了
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <stack>
using namespace std;
typedef struct A
{
int lleft;
int carea;
};
int main()
{
string input;
cin>>input;
stack<int> s;
stack<A> a;
vector<int> areas;
int totalArea=0;
for(int i=0;i<input.length();i++)
{
if(input[i]=='\\')
{
s.push(i);
}
else if(input[i]=='/'&&!s.empty())
{
int left=s.top();
s.pop();
int width=i-left;
totalArea+=width;
while (!a.empty() && a.top().lleft> left) {
width+=a.top().carea;
a.pop();
}
a.push({left,width});
}
}
while (a.size() > 0) {
areas.push_back(a.top().carea);
a.pop();
}
reverse(areas.begin(), areas.end());
cout<<totalArea<<endl;
cout<<areas.size();
for(int i=0;i<areas.size();i++)
{
cout<<" "<<areas[i];
}
return 0;
}