题目链接:http://acm.zzuli.edu.cn/problem.php?id=2481
时间限制: 1 Sec 内存限制: 128 MB
题目描述
一天小新感觉无聊,就去找他的朋友小新新和小新新新。经过商量,他们决定玩扑克牌,但普通的玩法他们觉得太无聊了,便制定了新的玩法,规则如下:
1.一副牌将大小王舍去,只用其余的52张牌。A,2,3,4,5,6,7,8,9,10,J,Q,K分别代表点数为1,2,3,4,5,6,7,8,9,10,11,12,13。
2.先从牌堆中抽取一张牌,记录该牌点数为M(该牌不放回),然后按小新新新,小新新,小新的顺序轮流拿牌,每人总共拿三张牌。拿完后,将每个人牌的点数加起来,然后对M取余,得到的点数即为最终的点数,最终点数最大的人即为赢家。
3.每局结束后会重新洗牌。
由于小新总是输,所以小新新和小新新新决定明牌与小新打(但这是比大小,明不明牌有什么关系吗),当小新新新和小新新三张牌都拿完了,小新已经拿了两张牌时,小新想知道自己是否有机会赢。
输入
第一行输入一个整数T(T<=1000),代表有T组数据。
每组数据第一行一张牌面,代表从牌堆中所抽取的那张牌。接下来两行每行包含三张牌面,中间由空格分开,第一行代表小新新的牌面,第二行代表小新新新的牌面,最后一行包含两张牌面(代表此时小新手里的牌)和一个'?'(代表这张牌还未知)。牌面为A,2,3,4,5,6,7,8,9,10,J,Q,K中的一张。
输出
对于每组数据输出一行,如果小新可能赢,则输出"I can win";如果在最好情况下,小新的点数可能与小新新或小新新新中点数较高的人点数一样,输出"I may not lose",如果小新的点数一定会比小新新或小新新新低,就输定了,则输出"I'm a loser"。
样例输入
2
K
5 2 4
9 A K
8 6 ?
Q
5 2 4
9 A K
6 6 ?
样例输出
I can win
I may not lose
解题思路
模拟一下打牌的过程就行了,先算出来小新新和小新新新点数最大的那一个max,并把他们抽取的牌给减掉(不放回)。最后遍历十三种牌,看看有没有一张牌能使小新的点数大于max,或等于max,最后输出相应的结果。
#include <stdio.h>
int edge(char a[])
{
if (a[0] >= '1' && a[0] <= '9')
{
if (a[1] != '0')
return a[0] - '0';
return 10;
}
switch(a[0])
{
case 'A': return 1;
case 'J': return 11;
case 'Q': return 12;
case 'K': return 13;
}
}
int main()
{
char s[3];
int t, m, q, maxn, temp, a[3], p[15];
scanf("%d%*c", &t);
while (t--)
{
a[0] = a[1] = a[2] = temp = 0;
for (int i = 1; i <= 13; i++)
p[i] = 4;
scanf("%s", s);
m = edge(s);
p[m]--;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
scanf("%s", &s);
if (s[0] != '?')
{
q = edge(s);
a[i] += q;
p[q]--;
}
}
}
a[0] %= m;
a[1] %= m;
maxn = a[0] > a[1] ? a[0] : a[1];
for (int i = 1; i <= 13; i++)
{
if (p[i])
{
if ((a[2] + i) % m == maxn)
temp = 2;
else if ((a[2] + i) % m > maxn)
{
temp = 1;
break;
}
}
}
if (temp == 1)
printf("I can win\n");
else if (!temp)
printf("I'm a loser\n");
else printf("I may not lose\n");
}
return 0;
}