ZZULI - 小新三連(一):小新在打牌(模擬)
題目連結: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; }