1 条题解
-
0
📝 题目大意
有三道题,分值分别为 1、2、4 分。给定高桥君的得分 和青木君的得分 。すぬけ君能解出两人中至少有一人解出的题目,求すぬけ君的得分。由于每题分值都是 2 的幂,每个人的得分唯一对应其解出的题目集合,答案也唯一确定。
💡 解题思路
-
题目分析:
- ,即所有可能的得分组合(三道题全错 0 分到全对 7 分)。
- 三道题的分值分别为 ,恰好对应二进制三个 bit 位的权值。因此 和 实际上用一个 3-bit 二进制数编码了每个人的解题情况。
- すぬけ君能解出"至少有一人解出"的题目,这等价于集合的"并集"操作。
-
算法推导:
- すぬけ君的得分 = 高桥君和青木君解题集合的并集所对应的分数。
- 在二进制视角下,"至少一人解出"就是按位或(bitwise OR):如果某个 bit 位上任意一人为 1,结果就是 1。
- 因此答案即为 (按位或)。
- std.cpp 的实现没有直接使用
|运算符,而是从高位到低位逐位判断:- 先看 4 分的题目(二进制最高位):若
a >= 4或b >= 4,则结果c加上 4,并将满足条件者的分数减去 4,消除高位影响。 - 再看 2 分的题目:若当前
a >= 2或b >= 2,则c加上 2,同理减去 2。 - 最后看 1 分的题目:若
a >= 1或b >= 1,则c加上 1。
- 先看 4 分的题目(二进制最高位):若
- 本质与
a | b完全等价,但用条件判断显式地模拟了位运算过程,适合不熟悉位运算的初学者理解。
-
边界与细节:
- :两人都没解出任何题,任意条件都不满足,
c = 0,输出 0。 - 最大值 :所有条件都满足,
c = 4 + 2 + 1 = 7,即三题全对。 - 注意 std.cpp 中减法操作是为了"消费"掉已处理的分数,避免低位判断时高位分数产生干扰。例如 (即 4+1),先处理 4 →
a变为 1,再处理 2 → 不满足,最后处理 1 → 满足,正确计入。
- :两人都没解出任何题,任意条件都不满足,
⏱️ 复杂度分析
- 时间复杂度:,仅进行常数次条件判断与算术运算。
- 空间复杂度:,仅使用几个整型变量。
💻 标准代码 (C++)
#include <bits/stdc++.h> using namespace std; signed main () { int a, b, c = 0; // c 用于累加すぬけ君的得分 scanf("%d%d", &a, &b); // 从高位到低位依次检查三道题(分值 4, 2, 1) // 若两人中至少一人解出了当前分值的题,すぬけ君也能解出 if (a >= 4 || b >= 4) { // 检查 4 分的题 c += 4; // すぬけ君得到 4 分 if (a >= 4) a -= 4; // 消除高桥君已处理的 4 分 if (b >= 4) b -= 4; // 消除青木君已处理的 4 分 } if (a >= 2 || b >= 2) { // 检查 2 分的题 c += 2; if (a >= 2) a -= 2; if (b >= 2) b -= 2; } if (a >= 1 || b >= 1) { // 检查 1 分的题 c += 1; if (a >= 1) a -= 1; if (b >= 1) b -= 1; } printf("%d", c); // 输出すぬけ君的得分 return 0; } -
- 1
信息
- ID
- 636
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者