17-比赛1 C - Binary Nim (栈的游戏)
题目描述
Tweedle-Dee 和 Tweedle-Dum 正在进行一场激烈的二进制 Nim 游戏。这是你没有玩过的船
新版本,游戏包含 N 个栈,每个栈只包含 0 和 1 的元素。
就像一般的 Nim 游戏一样,两人轮流行动。玩家在一回合中,必须选择一个非空的栈,然后
从栈顶取出至少一个元素。不过,Tweedle-Dee 只能从栈顶是 0 的栈中取出元素,而 Tweedle-Dum
只能从栈顶是 1 的栈中取出元素。无法行动的玩家落败。
Suzumo 懒得等游戏结束了。给定先手玩家,请求出谁会获胜。别忘了,Tweedle-Dee 和
Tweedle-Dum 都是王者级别的玩家,他们都会采取最优策略。
输入格式
输入的第一行包含一个整数 T,代表测试数据的组数。接下来是 T 组数据。
每组数据的第一行包含一个整数 N 和一个字符串 S,分别代表栈的数量和先手玩家的名称。
接下来 N 行,每行包含一个二进制串 B,代表一个栈。串的第一个字符代表栈顶。
输出格式
对于每组数据,如果 Tweedle-Dee 获胜,则输出一行“Dee”,否则输出一行“Dum”。
数据范围
• 1 ≤ T ≤ 500
• 1 ≤ N ≤ 50
• 1 ≤ |B| ≤ 50
• B 仅包含 0 和 1
• S 只会是“Dee”或者“Dum”
输入
2
2 Dee
101
010
2 Dum
101
010
输出
Dum
Dee
=======================================================================================================================================
比赛时未解决的题目:
学长的题解:
=======================================================================================================================================
代码如下:
1 # include <bits/stdc++.h> 2 using namespace std; 3 4 char name[5], Stack[55]; 5 6 int main () 7 { 8 int T, n; 9 scanf("%d", &T); 10 while (T--) { 11 scanf("%d %s", &n, name); 12 int num_0 = 0, num_1 = 0; 13 for (int i = 1; i <= n; ++i) { 14 scanf("%s", Stack); 15 int len = strlen(Stack); 16 for (int j = 0; j < len; ++j) { 17 if (Stack[j] == Stack[0]) { 18 if (Stack[0] == '0') ++num_0; 19 else ++num_1; 20 } 21 } 22 } 23 if (name[1] == 'e') puts(num_0 > num_1 ? "Dee" : "Dum"); 24 else puts(num_1 > num_0 ? "Dum" : "Dee"); 25 } 26 return 0; 27 }