Card Game 的题解


记住只在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。
在解题之前提交题解的代码会导致封禁。

作者: admin

概述

本题要求计算在随机翻牌的 4 种等可能对局中,Suneet 最终获胜的次数。核心解法是枚举所有 4 种翻牌顺序组合,分别模拟两回合并比较胜场数。

分析
核心观察

每位玩家只有 2 张牌,游戏恰好进行两回合。第一回合双方各从自己的两张牌中选一张翻开,第二回合翻开剩下的唯一一张,因此总对局方式为 2 \times 2 = 4 种,可以直接枚举。

思路

将 Suneet 的两张牌记为 a_1, a_2,Slavic 的两张牌记为 b_1, b_2。枚举第一回合 Suneet 出的牌在 {a_1, a_2} 中的位置 i(0 或 1),以及 Slavic 出的牌在 {b_1, b_2} 中的位置 j(0 或 1)。第二回合双方出剩余的牌。对于每种组合,计算 Suneet 赢得的回合数(大于对方)和 Slavic 赢得的回合数(小于对方),若 Suneet 的胜场数大于 Slavic 的胜场数,则该对局计入答案。由于双方牌值可能相等导致平局,但最终比较的是胜场数严格大于对方。

具体示例

以样例第一组 a_1=3, a_2=8, b_1=2, b_2=6 为例:

  • 组合 (a_1=3, b_1=2) 第一回合 Suneet 胜,第二回合 (8,6) Suneet 胜,总胜场 2>0,计数。
  • 组合 (3,6) 第一回合 Slavic 胜,第二回合 (8,2) Suneet 胜,胜场 1=1,不计。
  • 组合 (8,6) 第一回合 Suneet 胜,第二回合 (3,2) Suneet 胜,计数。
  • 组合 (8,2) 第一回合 Suneet 胜,第二回合 (3,6) Slavic 胜,胜场 1=1,不计。总计数 2,符合输出。
算法步骤
  1. 读入测试用例数 t。
  2. 对每个测试用例,读入四张牌 a1, a2, b1, b2。
  3. 初始化答案 ans = 0。
  4. 枚举第一回合 Suneet 的牌选择 i(0 表示 a1,1 表示 a2)和 Slavic 的牌选择 j(0 表示 b1,1 表示 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 则加 1,若 x2 > y2 则加 1。
    • 计算 Slavic 胜场数 win_b:若 x1 < y1 则加 1,若 x2 < y2 则加 1。
    • 若 win_s > win_b,则将 ans 加 1。
  5. 输出 ans。
复杂度分析
  • 时间:每个测试用例枚举 4 种组合,O(1)。
  • 空间:O(1)。
实现注意事项
  • 四张牌的数值范围小,无需考虑优化。
  • 平局(相等)不影响任何一方的胜场,只影响比较时的基数。
  • 枚举时可采用两层循环(0 到 1)以避免重复代码。
  • 使用 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()

评论

目前没有评论。