The Preliminary Contest for ICPC Asia Shenyang 2019
Texas hold'em Poker
#include <bits/stdc++.h> using namespace std; const int maxn=1e6+10; int num[1000]; int shun(){ for (int i=15;i>=5;i--){ if (num[i]&&num[i-1]&&num[i-2]&&num[i-3]&&num[i-4]) return i; } return -1; } struct node { int rk, num1, num2, num3; string na; bool operator<(const node a) const { if (rk != a.rk) return rk > a.rk; if (num1 != a.num1) return num1 > a.num1; if (num2 != a.num2) return num2 > a.num2; if (num3 != a.num3) return num3 > a.num3; return na < a.na; } }b[maxn]; int n; string na,s; unordered_map<string,int>ma; int main() { //freopen("1.txt", "r", stdin); ma["A"] = 1; ma["2"] = 2; ma["3"] = 3; ma["4"] = 4; ma["5"] = 5; ma["6"] = 6; ma["7"] = 7; ma["8"] = 8; ma["9"] = 9; ma["10"] = 10; ma["J"] = 11; ma["Q"] = 12; ma["K"] = 13; while (cin >> n) { for (int i = 1; i <= n; i++) { cin >> na >> s; b[i].na = na; string ss; int len = s.length(); for (int j = 0; j <= 15; j++) num[j] = 0; for (int j = 0; j < len; j++) { ss = ""; if (s[j] != '1') ss = s[j]; else { ss = s[j]; ss = ss + s[j + 1]; j++; } num[ma[ss]]++; } if (num[10] && num[11] && num[12] && num[13] && num[1]) { b[i].rk = 8; b[i].num1 = b[i].num2 = b[i].num3 = 0; continue; } int k=shun(); if (k!=-1) { b[i].rk = 7; b[i].num1 = k; continue; } int f4 = 0, kk; for (int j = 0; j <= 15; j++) { if (num[j] == 4) { kk = j; f4 = 1; break; } } if (f4) { int kkk; for (int j = 0; j <= 15; j++) { if (num[j] == 1) { kkk = j; break; } } b[i].rk = 6; b[i].num1 = kk; b[i].num2 = kkk; b[i].num3 = 0; continue; } int f3 = 0; for (int j = 0; j <= 15; j++) { if (num[j] == 3) { kk = j; f3 = 1; break; } } if (f3) { int kkk, f2 = 0; for (int j = 0; j <= 15; j++) { if (num[j] == 2) { kkk = j; f2 = 1; break; } } if (f2) { b[i].rk = 5; b[i].num1 = kk; b[i].num2 = kkk; b[i].num3 = 0; continue; } int sum = 0; for (int j = 0; j <= 15; j++) { if (num[j] == 1) { sum += j; } } b[i].rk = 4; b[i].num1 = kk; b[i].num2 = sum; b[i].num3 = 0; continue; } kk = 0; for (int j = 0; j <= 15; j++) { if (num[j] == 2) { kk++; } } if (kk == 2) { int mx = 0, mi = 10000, kkk; for (int j = 0; j <= 15; j++) { if (num[j] == 2) { mx = max(mx, j); mi = min(mi, j); } if (num[j] == 1) { kkk = j; } } b[i].rk = 3; b[i].num1 = mx; b[i].num2 = mi; b[i].num3 = kkk; continue; } if (kk == 1) { int kkk, sum = 0; for (int j = 0; j <= 15; j++) { if (num[j] == 2) { kkk = j; } else if (num[j]) sum += j; } b[i].rk = 2; b[i].num1 = kkk; b[i].num2 = sum; b[i].num3 = 0; continue; } int sum = 0; for (int j = 0; j <= 15; j++) { if (num[j]) sum += j; } b[i].rk = 1; b[i].num1 = sum; b[i].num2 = 0; b[i].num3 = 0; } sort(b + 1, b + n + 1); for (int i = 1; i <= n; i++) { cout << b[i].na << endl; } } return 0; }