Go to diff to previous submission
#include <algorithm> #include <cctype> #include <cmath> #include <complex> #include <cstdio> #include <cstring> #include <iomanip> #include <iostream> #include <list> #include <map> #include <queue> #include <set> #include <sstream> #include <stack> #include <string> #include <utility> #include <vector> using namespace std; #define DEBUG(x) cout << ">>> " << #x << " : " << x << endl; #define REP(i,a) for (int i = 0; i < (a); ++i) #define FOR(i,a,b) for (int i = (a); i <= (b); ++i) #define FORD(i,a,b) for (int i = (a); i >= (b); --i) inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; } const int INF = 1<<29; typedef long long ll; /////////////////////////////////////////////////////////////////////////// const int MAX = 14; int get_rank(char c) { switch(c) { case '2': return 1; break; case '3': return 2; break; case '4': return 3; break; case '5': return 4; break; case '6': return 5; break; case '7': return 6; break; case '8': return 7; break; case '9': return 8; break; case 'X': return 9; break; case 'J': return 10; break; case 'Q': return 11; break; case 'K': return 12; break; case 'A': return 13; break; } DEBUG("AAAAAAAAAAAAAAAAAAAAAAAAAAAAA") return -1; } int get_suit(char c) { switch(c) { case 'c': return 0; break; case 'd': return 1; break; case 'h': return 2; break; case 's': return 3; break; } DEBUG("AAAAAAAAAAAAAAAAAAAAAAAAAAAAA") return -1; } struct Card { int rank, suit; }; struct Hand { int type; int order; Hand(): type(-1), order(0) {} bool operator<(const Hand & h) const { return type < h.type || (type == h.type && order < h.order); } bool operator==(const Hand & h) const { return type == h.type && order == h.order; } }; int get_order(int start, vector<int> & v) { REP(i, v.size()) start = start*MAX + v[v.size()-1-i]; return start; } int ranks[MAX], suits[4]; Hand get_hand(vector<Card> & cards) { memset(ranks, 0, sizeof(ranks)); memset(suits, 0, sizeof(suits)); REP(i, cards.size()) { ++ranks[cards[i].rank]; ++suits[cards[i].suit]; } int straight = 0, flush = 0; vector<int> one, two, three, four; REP(i, MAX) if (ranks[i] == 1) one.push_back(i); else if (ranks[i] == 2) two.push_back(i); else if (ranks[i] == 3) three.push_back(i); else if (ranks[i] == 4) four.push_back(i); REP(i, 4) if (suits[i] == 5) ++flush; ranks[0] = ranks[MAX-1]; REP(i, MAX) { if (i+5 > MAX) break; bool ok = true; REP(j, 5) if (!ranks[i+j]) ok = false; if (ok) straight = i+1; } Hand result; // royal flush if (straight && flush) { result.type = 8; result.order = straight; } // poker else if (four.size()) { result.type = 7; result.order = four[0] * MAX + one[0]; } // full house else if (three.size() && two.size()) { result.type = 6; result.order = three[0] * MAX + two[0]; } // flush else if (flush) { result.type = 5; result.order = get_order(0, one); } // straight else if (straight) { result.type = 4; result.order = straight; } // three else if (three.size()) { result.type = 3; result.order = three[0]; result.order = get_order(result.order, one); } // two pairs else if (two.size() == 2) { result.type = 2; result.order = get_order(0, two); result.order = get_order(result.order, one); } // pair else if (two.size()) { result.type = 1; result.order = two[0]; result.order = get_order(result.order, one); } // one card else { result.type = 0; result.order = get_order(0, one); } return result; } Card table[7], player[10][2]; int main() { /*int T; scanf("%d", &T); while (T--) { vector<Card> c(5); char r, s; REP(i, 5) { scanf(" %c %c", &r, &s); c[i].rank = get_rank(r); c[i].suit = get_suit(s); } Hand h = get_hand(c); cout << "Type: " << h.type << " Order: " << h.order << endl; } return 0;*/ int N; while (scanf("%d", &N) == 1) { char r, s; REP(i, 5) { scanf(" %c %c", &r, &s); table[i].rank = get_rank(r); table[i].suit = get_suit(s); } REP(i, N) REP(j, 2) { scanf(" %c %c", &r, &s); player[i][j].rank = get_rank(r); player[i][j].suit = get_suit(s); } Hand best; vector<int> winners; REP(p, N) { table[5] = player[p][0]; table[6] = player[p][1]; Hand hand; FOR(f1, 0, 6) FOR(f2, f1+1, 6) { vector<Card> h; REP(i, 7) if (i != f1 && i != f2) h.push_back(table[i]); Hand temp = get_hand(h); if (hand < temp) hand = temp; } if (best < hand) { best = hand; winners.clear(); } if (best == hand) { winners.push_back(p); } } REP(i, winners.size()) { if (i) printf(" "); printf("%d", winners[i]+1); } printf("\n"); } return 0; }
--- c4.s782.cteam052.rhino.cpp.0.rhino.cpp +++ c4.s791.cteam052.rhino.cpp.0.rhino.cpp @@ -91,4 +91,5 @@ REP(i, v.size()) start = start*MAX + v[v.size()-1-i]; + return start; } @@ -190,4 +191,21 @@ int main() { + /*int T; + scanf("%d", &T); + while (T--) + { + vector<Card> c(5); + char r, s; + REP(i, 5) + { + scanf(" %c %c", &r, &s); + c[i].rank = get_rank(r); + c[i].suit = get_suit(s); + } + Hand h = get_hand(c); + cout << "Type: " << h.type << " Order: " << h.order << endl; + } + return 0;*/ + int N; while (scanf("%d", &N) == 1)