相信你是最棒哒!!!
文章目录
题目描述
Suneet 和 Slavic 玩一个卡牌游戏。游戏规则如下:
- 每张卡片的整数值在 1 和 10之间。
- 每位玩家获得 2 张面朝下的卡片(因此玩家不知道自己的卡片)。
- 游戏是回合制的,且 恰好进行两轮。在每轮中,两位玩家随机选择一张 未翻开的 卡片并翻开。翻开卡片数字严格较大的玩家赢得该轮。如果数字相等,则无人获胜。
- 如果一位玩家赢得的轮数超过另一位玩家(即严格大于),则该玩家赢得游戏。如果轮数相等,则无人获胜。
由于 Suneet 和 Slavic 不是最好的朋友,你需要计算 Suneet 最终获胜的游戏可能性数量。
为了更好地理解,请查看备注部分。
输入
第一行包含一个整数 𝑡 (1≤𝑡≤104) --- 测试用例的数量。
每个测试用例的唯一一行包含 44 个整数 𝑎1, 𝑎2, 𝑏1, 𝑏2 (1≤𝑎1,𝑎2,𝑏1,𝑏2≤10),其中 𝑎1 和 a2 代表 Suneet 拥有的卡片,而 b1 和 b2 代表 Slavic 拥有的卡片。
输出
对于每个测试用例,输出一个整数 --- Suneet 在所有可能的游戏中获胜的游戏数量。
示例
Input | Output |
---|---|
5 3 8 2 6 1 1 1 1 10 10 2 2 1 1 10 10 3 8 7 2 |
2 0 4 0 2 |
备注
考虑第一个测试用例,当 Slavic 拥有值为 2 和 6 的卡片,而 Suneet 拥有值为 3 和 8 的卡片时。游戏可能以 4 种不同的方式进行:
-
Suneet 翻开 3,Slavic 翻开 2。Suneet 赢得第一轮。然后,Suneet 翻开 8,Slavic 翻开 66。Suneet 也赢得第二轮。由于 Suneet 赢得了 2 轮,他赢得了游戏。
-
Suneet 翻开 3,Slavic 翻开 6。Slavic 赢得第一轮。然后,Suneet 翻开 8,Slavic 翻开 2。Suneet 赢得第二轮。由于两位玩家赢得的轮数相等,没人获胜。
-
Suneet 翻开 8,Slavic 翻开 6。Suneet 赢得第一轮。然后,Suneet 翻开 3,Slavic 翻开 2。Suneet 也赢得第二轮。由于 Suneet 赢得了 2 轮,他赢得了游戏。
-
Suneet 翻开 8,Slavic 翻开 2。Suneet 赢得第一轮。然后,Suneet 翻开 3,Slavic 翻开 6。Slavic 赢得这一轮。由于两位玩家赢得的轮数相等,没人获胜。
正确代码
注释版
#include <stdio.h>
int main() {
int t;
scanf("%d", &t);
while (t--) { // 使用while循环来处理每一个测试用例,每次循环处理一个用例,直到t减到0
int a1, a2, b1, b2; // 定义四个整数变量,分别用于存储Suneet和Slavic手中的两张卡牌的数值
scanf("%d %d %d %d", &a1, &a2, &b1, &b2); // 从标准输入读取四个整数,分别存储在变量a1, a2, b1, b2中
int cnt = 0; // 定义一个计数器变量cnt,用于记录Suneet赢牌的组合数量,初始值为0
// 判断第一种出牌情况:Suneet出a1对Slavic的b1,Suneet出a2对Slavic的b2
if ((a1 > b1 && a2 >= b2) || (a1 >= b1 && a2 > b2))
cnt++; // 如果Suneet的a1大于Slavic的b1,并且a2大于等于b2;或者a1大于等于b1,并且a2大于b2,则Suneet在这种情况下赢,cnt加1
// 判断第二种出牌情况:Suneet出a1对Slavic的b2,Suneet出a2对Slavic的b1
if ((a1 > b2 && a2 >= b1) || (a1 >= b2 && a2 > b1))
cnt++; // 如果Suneet的a1大于Slavic的b2,并且a2大于等于b1;或者a1大于等于b2,并且a2大于b1,则Suneet在这种情况下赢,cnt加1
printf("%d\n", cnt * 2); // 输出Suneet赢牌的组合数量,由于每种情况都有两种出牌顺序(即先后顺序),所以将cnt乘以2
}
return 0;
}
简洁版
#include <stdio.h>
int main() {
int t;
scanf("%d", &t);
while (t--) {
int a1, a2, b1, b2;
scanf("%d %d %d %d", &a1, &a2, &b1, &b2);
int cnt = 0;
if ((a1 > b1 && a2 >= b2) || (a1 >= b1 && a2 > b2))
cnt++;
if ((a1 > b2 && a2 >= b1) || (a1 >= b2 && a2 > b1))
cnt++;
printf("%d\n", cnt * 2);
}
return 0;
}
总结
在这个卡牌游戏中,每个玩家都有两张牌,每轮游戏双方各出一张牌。由于出牌的顺序有两种可能性(即玩家A先出牌或玩家B先出牌),所以对于每一种牌的组合情况,实际上有两种不同的出牌顺序。
例如,如果Suneet有牌a1
和a2
,Slavic有牌b1
和b2
,那么可能的出牌顺序有:
- Suneet出
a1
对Slavic的b1
,然后Suneet出a2
对Slavic的b2
。 - Suneet出
a1
对Slavic的b2
,然后Suneet出a2
对Slavic的b1
。 - Suneet出
a2
对Slavic的b1
,然后Suneet出a1
对Slavic的b2
。 - Suneet出
a2
对Slavic的b2
,然后Suneet出a1
对Slavic的b1
。
这四种出牌顺序中,第1和第4种是Suneet先出a1
,第2和第3种是Suneet先出a2
。对于每一种牌的组合,都有这样两种出牌顺序,所以对于每一种赢牌的组合情况,实际上有两倍的出牌方式。这就是为什么在计算Suneet赢牌的组合数量时,需要将cnt
乘以2的原因。这样做是为了考虑到所有可能的出牌顺序,确保我们计算的是所有可能的游戏结果。