ALDS1_3_D: Areas on the Cross-Section Diagram(栈的应用)

题目描述

这里写图片描述

计算积水的面积。

输入

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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值