1 条题解
-
0
题意
在公交站等车。车站里除了他还有其他人。事件按时间顺序给出:
- :有 个人到达车站(加入排队)。
- :一辆有 个空座的公交车到达。
当公交车到达时: . 车站里除了 以外的人依次上车。如果空座足够,他们全部上车;否则只能上 个人,其余留下。 . 如果以上过程结束后还有空座, 可以选择上这辆车。
要求:对每个 事件,判断 Monocarp 是否可能乘坐这辆车。
关键思路
- 只有 享有“最后上车”的特权。
- 其他人上车的过程不受 是否上车的影响。
- 因此,我们只需要维护当前除了 以外的排队人数 。
- 公交车到达时:
- 先计算其他人能上车的人数:。
- 更新 。
- 剩余座位 。
- 若 ,则 Monocarp 可以上车 → ;否则 。
算法步骤
. 初始化 。 . 遍历每个事件:
- 若为 :。
- 若为 :
- 若 ,记录 ;否则记录 。 . 按顺序输出所有 事件的答案。
复杂度
- 每个事件 处理。
- 总复杂度 ,。
示例验证
输入:
10 P 2 P 5 B 8 P 14 B 5 B 9 B 3 P 2 B 1 B 2模拟过程:
- →
- →
- :, , →
- →
- :, , →
- :, , →
- :, , →
- →
- :, , →
- :, , →
输出:
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; }
总结
- 核心:维护“除 外”的排队人数。
- 每次公交车到达时,先让其他人上车(减少 ),再检查剩余座位。
- 不需要维护 是否上车,因为他上车与否不影响 。
- 1
信息
- ID
- 7166
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者