【天梯赛L2 栈混洗】L2-032 彩虹瓶 (25 分)

#include<bits/stdc++.h>
using namespace std;

int N, M, K;

/*
有一个有序序列A = {1, 2, 3, ..., n}
判断序列B是否是有序序列A的栈混洗
*/

int main() {
    cin >> N >> M >> K;
    // 每次输入的乱序序列B都能通过一个中间栈进行临时存放,在某个时间出栈可以达到有序序列
    for(int i = 0;i < K;++i) { 
        int now = 1, x, full = false; // 用now来表示有序序列A当前的元素
        stack<int> S;
        for(int j = 0;j < N;++j) {
            cin >> x;
            S.push(x);
            while(!S.empty() && now == S.top()) { // 是while是因为如果栈中的排列是按照顺序的,那就把他们都出栈
                S.pop();
                now++;
            }
            if(S.size() > M) full = true; // 栈溢出(货架不够放了)
        }
        (!full && !S.size()) ? cout<<"YES\n" : cout<<"NO\n"; // 如果有过货架不够放的情况 或者 临时货架还有货 那就No 
    } 

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值