BISHI17 纸牌游戏¶
简单通过率 37.38%python3样例通过牛客 AC
讲解章节:模拟
一句话
双方各两张牌,翻牌顺序随机,数出 Alex 获胜的顺序数。
解题思路¶
这题考什么¶
先把「随机」这个词翻译成「有限种等可能的情形」,再暴力枚举。 Alex 手上两张牌,先翻哪张有 2 种选择;Bob 同理 2 种; 两人的选择互不影响,所以「翻牌顺序」一共 2 * 2 = 4 种, 每种把两个回合模拟一遍、看 Alex 是否赢的回合更多即可。 这题问的是顺序的数量而不是概率,所以答案就是这 4 种里合格的个数, 上界必然是 4(样例第 3 组的答案正是 4)。
zip(a, b) 恰好把两人各自的出牌序列按回合对齐:第 k 对就是第 k 回合。
数据规模与复杂度¶
t <= 1e4 组,每组 4 种顺序 * 2 个回合,总复杂度 O(t)。 每组固定 4 个整数、行长一致,所以可以直接用 data[1 + 4i : 5 + 4i] 定位, 不需要额外的游标变量。
坑在哪¶
- 单个回合比大小时,相等是双方都不得分,不是各得一分, 所以要分别数出 win 和 lose,不能用「win >= 1」之类的近似判断;
- 「赢得回合数更多者获胜」是严格更多:一胜一负、两回合都打平, 都算无人获胜,不能算 Alex 赢。判断必须是 win > lose;
- 统计的是顺序数量,牌面重复也照样算不同顺序。 10 10 2 2 里 Alex 的两种「顺序」牌面完全相同,但仍然各算一种, 答案是 4 而不是 1;
- 题面给出的牌是 a1,a2 属于 Alex、b1,b2 属于 Bob, 而示例说明里的叙述把两人的牌讲反了,以输入描述为准。
样例复核¶
3 8 2 6:Alex 持 3、8,Bob 持 2、6。四种顺序中 (3,8) 对 (2,6) 赢两局、(8,3) 对 (6,2) 赢两局,另两种各一胜一负, 合计 2 种,与样例一致。
参考实现¶
[:octicons-arrow-left-16: BISHI16](BISHI16.md) [BISHI18 :octicons-arrow-right-16:](BISHI18.md)