1. 程式人生 > >小新三連(一):小新在打牌 ZZULIOJ - 2481 模擬

小新三連(一):小新在打牌 ZZULIOJ - 2481 模擬

題解

計算對手和自身已有牌的和並對M取模 計算過程中統計剩餘牌的數量
嘗試所有剩餘的牌 如果可以贏則贏 不能贏能平就平

AC程式碼

#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int INF = 0x3f3f3f3f;

int toVal(char *c) //將牌的字串轉為數值
{
	if (strlen(c) == 2)
		return 10;
	if (c[0] == 'A')
		return 1;
	if
(c[0] == 'J') return 11; if (c[0] == 'Q') return 12; if (c[0] == 'K') return 13; return c[0] - '0'; } int main() { #ifdef LOCAL freopen("C:/input.txt", "r", stdin); #endif int T; cin >> T; while (T--) { int a[14] = { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 }; //剩餘牌數量 char s[10]; scanf
("%s", s); int M = toVal(s); a[M]--; //抽出的牌數量需要減少 int x = 0, y = 0, z = 0, v; for (int i = 0; i < 3; i++) //倆對手求和並取模 scanf("%s", s), v = toVal(s), a[v]--, x = (x + v) % M; for (int i = 0; i < 3; i++) scanf("%s", s), v = toVal(s), a[v]--, y = (y + v) % M; for (int i = 0; i < 2; i++)
scanf("%s", s), v = toVal(s), a[v]--, z = (z + v) % M; scanf("%s", s); int flag = -1; //-1輸 0不會輸 1贏 for (int i = 1; i <= 13; i++) if (a[i]) //還有牌 { if ((z + i) % M > max(x, y)) flag = max(flag, 1); //儘量取最優 if ((z + i) % M == max(x, y)) flag = max(flag, 0); } if (flag == -1) cout << "I'm a loser" << endl; else if (flag == 0) cout << "I may not lose" << endl; else cout << "I can win" << endl; } return 0; }