1 条题解
-
0
📝 题目大意
有 名玩家,每人打出一张卡牌,颜色为 ,数值为 (所有 互不相同)。若场上存在颜色为 的卡牌,则颜色为 中数值最大者获胜;否则,颜色与玩家 卡牌颜色相同的卡牌中数值最大者获胜。输出胜者编号。
💡 解题思路
- 题目分析:,,限制 互不相同(保证无平局)。只需要一次遍历即可得出答案,不需要排序或哈希表。
- 算法推导:
- 在一次遍历中同时维护两个候选答案:
maxValT/winnerT:颜色为 的卡牌中的最大 及其对应玩家编号;maxValC1/winnerC1:颜色为 (即玩家 的颜色)的卡牌中的最大 及其对应玩家编号。
- 遍历结束后,若
winnerT != -1(即存在颜色为 的卡牌),输出winnerT;否则输出winnerC1。
- 在一次遍历中同时维护两个候选答案:
- 边界与细节:
- 玩家编号从 开始,注意输出时 。
- 由于 互不相同,无需处理并列情况。
- 玩家 本身也可能是获胜者,这在第二种情况中自然覆盖(因为 颜色组必然包含玩家 )。
- 使用
-1作为初始值,因为 ,不会与有效值混淆。
⏱️ 复杂度分析
- 时间复杂度:,只需一次遍历。
- 空间复杂度:,用于存储 和 数组。
💻 标准代码 (C++)
#include <iostream> #include <vector> using namespace std; int main() { int N, T; cin >> N >> T; vector<int> C(N), R(N); for (int i = 0; i < N; i++) cin >> C[i]; // 读入颜色 for (int i = 0; i < N; i++) cin >> R[i]; // 读入数值 int maxValT = -1, winnerT = -1; // 颜色为T的卡牌中:最大数值 & 胜者编号 int maxValC1 = -1, winnerC1 = -1; // 颜色为C[0]的卡牌中:最大数值 & 胜者编号 for (int i = 0; i < N; i++) { if (C[i] == T) { // 情况1:颜色等于目标颜色T if (R[i] > maxValT) { maxValT = R[i]; winnerT = i + 1; // 转换为1-based编号 } } if (C[i] == C[0]) { // 情况2:颜色等于玩家1的颜色 if (R[i] > maxValC1) { maxValC1 = R[i]; winnerC1 = i + 1; } } } // 若存在颜色为T的卡牌,则情况1的胜者获胜;否则情况2的胜者获胜 if (winnerT != -1) { cout << winnerT << endl; } else { cout << winnerC1 << endl; } return 0; }
- 1
信息
- ID
- 710
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者