Source code for submission s791

Go to diff to previous submission

rhino.cpp

  1. #include <algorithm>
  2. #include <cctype>
  3. #include <cmath>
  4. #include <complex>
  5. #include <cstdio>
  6. #include <cstring>
  7. #include <iomanip>
  8. #include <iostream>
  9. #include <list>
  10. #include <map>
  11. #include <queue>
  12. #include <set>
  13. #include <sstream>
  14. #include <stack>
  15. #include <string>
  16. #include <utility>
  17. #include <vector>
  18. using namespace std;
  19.  
  20. #define DEBUG(x) cout << ">>> " << #x << " : " << x << endl;
  21. #define REP(i,a) for (int i = 0; i < (a); ++i)
  22. #define FOR(i,a,b) for (int i = (a); i <= (b); ++i)
  23. #define FORD(i,a,b) for (int i = (a); i >= (b); --i)
  24. inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; }
  25.  
  26. const int INF = 1<<29;
  27. typedef long long ll;
  28. ///////////////////////////////////////////////////////////////////////////
  29.  
  30. const int MAX = 14;
  31.  
  32. int get_rank(char c)
  33. {
  34. switch(c)
  35. {
  36. case '2': return 1; break;
  37. case '3': return 2; break;
  38. case '4': return 3; break;
  39. case '5': return 4; break;
  40. case '6': return 5; break;
  41. case '7': return 6; break;
  42. case '8': return 7; break;
  43. case '9': return 8; break;
  44. case 'X': return 9; break;
  45. case 'J': return 10; break;
  46. case 'Q': return 11; break;
  47. case 'K': return 12; break;
  48. case 'A': return 13; break;
  49. }
  50. DEBUG("AAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
  51. return -1;
  52. }
  53.  
  54. int get_suit(char c)
  55. {
  56. switch(c)
  57. {
  58. case 'c': return 0; break;
  59. case 'd': return 1; break;
  60. case 'h': return 2; break;
  61. case 's': return 3; break;
  62. }
  63. DEBUG("AAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
  64. return -1;
  65. }
  66.  
  67. struct Card
  68. {
  69. int rank, suit;
  70. };
  71.  
  72. struct Hand
  73. {
  74. int type;
  75. int order;
  76. Hand(): type(-1), order(0) {}
  77.  
  78. bool operator<(const Hand & h) const
  79. {
  80. return type < h.type || (type == h.type && order < h.order);
  81. }
  82.  
  83. bool operator==(const Hand & h) const
  84. {
  85. return type == h.type && order == h.order;
  86. }
  87. };
  88.  
  89. int get_order(int start, vector<int> & v)
  90. {
  91. REP(i, v.size())
  92. start = start*MAX + v[v.size()-1-i];
  93. return start;
  94. }
  95.  
  96. int ranks[MAX], suits[4];
  97. Hand get_hand(vector<Card> & cards)
  98. {
  99. memset(ranks, 0, sizeof(ranks));
  100. memset(suits, 0, sizeof(suits));
  101. REP(i, cards.size())
  102. {
  103. ++ranks[cards[i].rank];
  104. ++suits[cards[i].suit];
  105. }
  106.  
  107. int straight = 0, flush = 0;
  108. vector<int> one, two, three, four;
  109. REP(i, MAX)
  110. if (ranks[i] == 1) one.push_back(i);
  111. else if (ranks[i] == 2) two.push_back(i);
  112. else if (ranks[i] == 3) three.push_back(i);
  113. else if (ranks[i] == 4) four.push_back(i);
  114. REP(i, 4)
  115. if (suits[i] == 5) ++flush;
  116.  
  117. ranks[0] = ranks[MAX-1];
  118. REP(i, MAX)
  119. {
  120. if (i+5 > MAX) break;
  121. bool ok = true;
  122. REP(j, 5)
  123. if (!ranks[i+j]) ok = false;
  124. if (ok) straight = i+1;
  125. }
  126.  
  127. Hand result;
  128. // royal flush
  129. if (straight && flush)
  130. {
  131. result.type = 8;
  132. result.order = straight;
  133. }
  134. // poker
  135. else if (four.size())
  136. {
  137. result.type = 7;
  138. result.order = four[0] * MAX + one[0];
  139. }
  140. // full house
  141. else if (three.size() && two.size())
  142. {
  143. result.type = 6;
  144. result.order = three[0] * MAX + two[0];
  145. }
  146. // flush
  147. else if (flush)
  148. {
  149. result.type = 5;
  150. result.order = get_order(0, one);
  151. }
  152. // straight
  153. else if (straight)
  154. {
  155. result.type = 4;
  156. result.order = straight;
  157. }
  158. // three
  159. else if (three.size())
  160. {
  161. result.type = 3;
  162. result.order = three[0];
  163. result.order = get_order(result.order, one);
  164. }
  165. // two pairs
  166. else if (two.size() == 2)
  167. {
  168. result.type = 2;
  169. result.order = get_order(0, two);
  170. result.order = get_order(result.order, one);
  171. }
  172. // pair
  173. else if (two.size())
  174. {
  175. result.type = 1;
  176. result.order = two[0];
  177. result.order = get_order(result.order, one);
  178. }
  179. // one card
  180. else
  181. {
  182. result.type = 0;
  183. result.order = get_order(0, one);
  184. }
  185.  
  186. return result;
  187. }
  188.  
  189. Card table[7], player[10][2];
  190.  
  191. int main()
  192. {
  193. /*int T;
  194.   scanf("%d", &T);
  195.   while (T--)
  196.   {
  197.   vector<Card> c(5);
  198.   char r, s;
  199.   REP(i, 5)
  200.   {
  201.   scanf(" %c %c", &r, &s);
  202.   c[i].rank = get_rank(r);
  203.   c[i].suit = get_suit(s);
  204.   }
  205.   Hand h = get_hand(c);
  206.   cout << "Type: " << h.type << " Order: " << h.order << endl;
  207.   }
  208.   return 0;*/
  209.  
  210. int N;
  211. while (scanf("%d", &N) == 1)
  212. {
  213. char r, s;
  214. REP(i, 5)
  215. {
  216. scanf(" %c %c", &r, &s);
  217. table[i].rank = get_rank(r);
  218. table[i].suit = get_suit(s);
  219. }
  220. REP(i, N) REP(j, 2)
  221. {
  222. scanf(" %c %c", &r, &s);
  223. player[i][j].rank = get_rank(r);
  224. player[i][j].suit = get_suit(s);
  225. }
  226.  
  227. Hand best;
  228. vector<int> winners;
  229. REP(p, N)
  230. {
  231. table[5] = player[p][0];
  232. table[6] = player[p][1];
  233. Hand hand;
  234. FOR(f1, 0, 6) FOR(f2, f1+1, 6)
  235. {
  236. vector<Card> h;
  237. REP(i, 7)
  238. if (i != f1 && i != f2)
  239. h.push_back(table[i]);
  240. Hand temp = get_hand(h);
  241. if (hand < temp) hand = temp;
  242. }
  243.  
  244. if (best < hand)
  245. {
  246. best = hand;
  247. winners.clear();
  248. }
  249. if (best == hand)
  250. {
  251. winners.push_back(p);
  252. }
  253. }
  254.  
  255. REP(i, winners.size())
  256. {
  257. if (i) printf(" ");
  258. printf("%d", winners[i]+1);
  259. }
  260. printf("\n");
  261. }
  262. return 0;
  263. }
  264.  

Diff to submission s782

rhino.cpp

--- 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)