题目链接: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;
}