1 条题解

  • 0
    @ 2026-5-17 16:33:10

    题意

    MonocarpMonocarp 在公交站等车。车站里除了他还有其他人。事件按时间顺序给出:

    • PpP p:有 pp 个人到达车站(加入排队)。
    • BbB b:一辆有 bb 个空座的公交车到达。

    当公交车到达时: 11. 车站里除了 MonocarpMonocarp 以外的人依次上车。如果空座足够,他们全部上车;否则只能上 bb 个人,其余留下。 22. 如果以上过程结束后还有空座,MonocarpMonocarp 可以选择上这辆车。

    要求:对每个 BB 事件,判断 Monocarp 是否可能乘坐这辆车。


    关键思路

    • 只有 MonocarpMonocarp 享有“最后上车”的特权。
    • 其他人上车的过程不受 MonocarpMonocarp 是否上车的影响
    • 因此,我们只需要维护当前除了 MonocarpMonocarp 以外的排队人数 peoplepeople
    • 公交车到达时:
      • 先计算其他人能上车的人数:take=min(people,b)take = \min(people, b)
      • 更新 people=peopletakepeople = people - take
      • 剩余座位 remain=btakeremain = b - take
      • remain>0remain > 0,则 Monocarp 可以上车 → YESYES;否则 NONO

    算法步骤

    11. 初始化 people=0people = 022. 遍历每个事件:

    • 若为 PpP ppeople=people+ppeople = people + p
    • 若为 BbB b
      • take=min(people,b)take = \min(people, b)
      • people=peopletakepeople = people - take
      • remain=btakeremain = b - take
      • remain>0remain > 0,记录 YESYES;否则记录 NONO33. 按顺序输出所有 BB 事件的答案。

    复杂度

    • 每个事件 O(1)O(1) 处理。
    • 总复杂度 O(n)O(n)n103n \le 10^3

    示例验证

    输入:

    10
    P 2
    P 5
    B 8
    P 14
    B 5
    B 9
    B 3
    P 2
    B 1
    B 2
    

    模拟过程:

    • people=0people=0
    • P2P 2people=2people=2
    • P5P 5people=7people=7
    • B8B 8take=min(7,8)=7take=\min(7,8)=7, people=0people=0, remain=1remain=1YESYES
    • P14P 14people=14people=14
    • B5B 5take=5take=5, people=9people=9, remain=0remain=0NONO
    • B9B 9take=9take=9, people=0people=0, remain=0remain=0NONO
    • B3B 3take=0take=0, people=0people=0, remain=3remain=3YESYES
    • P2P 2people=2people=2
    • B1B 1take=1take=1, people=1people=1, remain=0remain=0NONO
    • B2B 2take=1take=1, people=0people=0, remain=1remain=1YESYES

    输出:

    YES
    NO
    NO
    YES
    NO
    YES
    

    与题目样例一致 ✅


    完整代码

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        int n;
        cin >> n;
        
        long long people = 0;  // 除了 Monocarp 以外的人数
        vector<string> ans;
        
        for (int i = 0; i < n; i++) {
            char type;
            cin >> type;
            if (type == 'P') {
                int p;
                cin >> p;
                people += p;
            } else { // type == 'B'
                int b;
                cin >> b;
                long long take = min(people, (long long)b);
                people -= take;
                long long remain = b - take;
                if (remain > 0) {
                    ans.push_back("YES");
                } else {
                    ans.push_back("NO");
                }
            }
        }
        
        for (const string& s : ans) {
            cout << s << "\n";
        }
        
        return 0;
    }
    

    总结

    • 核心:维护“除 MonocarpMonocarp 外”的排队人数。
    • 每次公交车到达时,先让其他人上车(减少 peoplepeople),再检查剩余座位。
    • 不需要维护 MonocarpMonocarp 是否上车,因为他上车与否不影响 peoplepeople
    • 1

    信息

    ID
    7166
    时间
    1000ms
    内存
    256MiB
    难度
    1
    标签
    递交数
    2
    已通过
    1
    上传者