Card Game 的题解
记住只在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。
在解题之前提交题解的代码会导致封禁。
在解题之前提交题解的代码会导致封禁。
作者:
概述
本题要求计算在随机翻牌的 种等可能对局中,Suneet 最终获胜的次数。核心解法是枚举所有
种翻牌顺序组合,分别模拟两回合并比较胜场数。
分析
核心观察
每位玩家只有 张牌,游戏恰好进行两回合。第一回合双方各从自己的两张牌中选一张翻开,第二回合翻开剩下的唯一一张,因此总对局方式为
种,可以直接枚举。
思路
将 Suneet 的两张牌记为 ,Slavic 的两张牌记为
。枚举第一回合 Suneet 出的牌在
中的位置
(
或
),以及 Slavic 出的牌在
中的位置
(
或
)。第二回合双方出剩余的牌。对于每种组合,计算 Suneet 赢得的回合数(大于对方)和 Slavic 赢得的回合数(小于对方),若 Suneet 的胜场数大于 Slavic 的胜场数,则该对局计入答案。由于双方牌值可能相等导致平局,但最终比较的是胜场数严格大于对方。
具体示例
以样例第一组 为例:
- 组合
第一回合 Suneet 胜,第二回合
Suneet 胜,总胜场
,计数。
- 组合
第一回合 Slavic 胜,第二回合
Suneet 胜,胜场
,不计。
- 组合
第一回合 Suneet 胜,第二回合
Suneet 胜,计数。
- 组合
第一回合 Suneet 胜,第二回合
Slavic 胜,胜场
,不计。总计数
,符合输出。
算法步骤
- 读入测试用例数
。
- 对每个测试用例,读入四张牌
a1, a2, b1, b2。 - 初始化答案
ans = 0。 - 枚举第一回合 Suneet 的牌选择
i(表示
a1,表示
a2)和 Slavic 的牌选择j(表示
b1,表示
b2):- 确定第一回合双方出的牌:
x1 = (i == 0 ? a1 : a2),y1 = (j == 0 ? b1 : b2)。 - 确定第二回合双方出的牌:
x2 = (i == 0 ? a2 : a1),y2 = (j == 0 ? b2 : b1)。 - 计算 Suneet 胜场数
win_s:若x1 > y1则加,若
x2 > y2则加。
- 计算 Slavic 胜场数
win_b:若x1 < y1则加,若
x2 < y2则加。
- 若
win_s > win_b,则将ans加。
- 确定第一回合双方出的牌:
- 输出
ans。
复杂度分析
- 时间:每个测试用例枚举
种组合,
。
- 空间:
。
实现注意事项
- 四张牌的数值范围小,无需考虑优化。
- 平局(相等)不影响任何一方的胜场,只影响比较时的基数。
- 枚举时可采用两层循环(
到
)以避免重复代码。
- 使用
std::array或vector存储双方牌,便于索引。
源代码
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
int a1, a2, b1, b2;
cin >> a1 >> a2 >> b1 >> b2;
int a[2] = {a1, a2};
int b[2] = {b1, b2};
int ans = 0;
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) {
int suneet_win = 0, slavic_win = 0;
// first round
if (a[i] > b[j]) suneet_win++;
else if (a[i] < b[j]) slavic_win++;
// second round
int a_rem = a[1 - i], b_rem = b[1 - j];
if (a_rem > b_rem) suneet_win++;
else if (a_rem < b_rem) slavic_win++;
if (suneet_win > slavic_win) ans++;
}
}
cout << ans << '\n';
}
return 0;
}
import sys
def solve():
data = sys.stdin.read().strip().split()
if not data:
return
t = int(data[0])
idx = 1
out = []
for _ in range(t):
a1, a2, b1, b2 = map(int, data[idx:idx+4])
idx += 4
a = [a1, a2]
b = [b1, b2]
ans = 0
for i in range(2):
for j in range(2):
suneet_win = 0
slavic_win = 0
if a[i] > b[j]:
suneet_win += 1
elif a[i] < b[j]:
slavic_win += 1
a_rem = a[1 - i]
b_rem = b[1 - j]
if a_rem > b_rem:
suneet_win += 1
elif a_rem < b_rem:
slavic_win += 1
if suneet_win > slavic_win:
ans += 1
out.append(str(ans))
sys.stdout.write("\n".join(out))
if __name__ == "__main__":
solve()
评论