1 条题解
-
0
📝 题目大意
有 名选手,依次发生 个事件:出示黄牌、出示红牌、或询问某选手是否已被退场。选手累计 2 张黄牌或收到 1 张红牌即被退场。对每个询问输出
Yes或No。💡 解题思路
- 题目分析:,数据量极小,直接模拟即可。题目保证已退场的选手不会再收到牌,因此无需额外判断。
- 算法推导:
- 用一个数组
a[i]记录选手 的"罚分"累计值。 - 黄牌 ,红牌 (如
std.cpp中a[x]++和a[x] += 2)。 - 这样,当
a[x] >= 2时,要么是两次黄牌(),要么是一张红牌(),恰好对应退场的两种条件。用一个阈值 统一判断,避免了分别维护黄牌计数和红牌标记的冗余。
- 用一个数组
- 边界与细节:
- 数组大小至少开到 ( 最大 ,
std.cpp开到 )。 - 询问时判断
a[x] < 2输出No,否则Yes。
- 数组大小至少开到 ( 最大 ,
⏱️ 复杂度分析
- 时间复杂度:,每个事件 处理。
- 空间复杂度:,用于存储罚分数组。
💻 标准代码 (C++)
#include <bits/stdc++.h> using namespace std; int n, q, op, x, a[105]; // a[i] 记录选手 i 的罚分累计 int main () { scanf("%d%d", &n, &q); while (q--) { scanf("%d%d", &op, &x); if (op == 1) // 黄牌:罚分 +1 a[x]++; else if (op == 2) // 红牌:罚分 +2(直接 >= 2,触发退场) a[x] += 2; else { // 询问:罚分 >= 2 即已退场 if (a[x] < 2) printf("No\n"); else printf("Yes\n"); } } return 0; }
- 1
信息
- ID
- 684
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者