Source code for submission s1370

Go to diff to previous submission

r.cpp

  1. #include <iostream>
  2. #include <iomanip>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cctype>
  6. #include <string>
  7. #include <cstring>
  8. #include <cmath>
  9. #include <algorithm>
  10. #include <utility>
  11. #include <stack>
  12. #include <vector>
  13. #include <queue>
  14. #include <deque>
  15. #include <set>
  16. #include <map>
  17. #include <list>
  18.  
  19. #define SIZEOF(a) (sizeof(a)/sizeof(a[0]))
  20. #define FILL(a,b) fill(a,a+SIZEOF(a),b)
  21. #define FOR(a,b,c) for(int a=b;a<=c;a++)
  22. #define FORARR(i,a) for(unsigned i=0; i<SIZEOF(a); i++)
  23. #define FOREACH(a,b) for(__typeof((b).begin()) a = (b).begin(); a!=(b).end(); a++)
  24. #define GETI(a) scanf("%d ", &a);
  25. #define SWAP(a,b) { __typeof(a) t = a; a = t; b = t; }
  26.  
  27. #define CV(i) cards[i].value
  28.  
  29. using namespace std;
  30.  
  31. struct card {
  32. int value;
  33. char color;
  34. card() {}
  35. card(char val, char color) : color(color) {
  36. switch (val) {
  37. case 'X':
  38. value = 10;
  39. break;
  40. case 'J':
  41. value = 11;
  42. break;
  43. case 'Q':
  44. value = 12;
  45. break;
  46. case 'K':
  47. value = 13;
  48. break;
  49. case 'A':
  50. value = 14;
  51. break;
  52. default:
  53. value = val - '0';
  54. }
  55. }
  56. };
  57.  
  58. bool operator<(const card& c, const card& d) {
  59. return c.value < d.value;
  60. }
  61.  
  62. int highest_value(const card* cards, int num) {
  63. int h = 0;
  64. FOR(i,0,num-1) {
  65. h = max(h, cards[i].value);
  66. }
  67. return h;
  68. }
  69.  
  70. bool same_color(const card* cards, int num) {
  71. char col = cards[0].color;
  72. FOR(i,1,num-1) {
  73. if (cards[i].color != col) {
  74. return false;
  75. }
  76. }
  77. return true;
  78. }
  79.  
  80. struct player {
  81. card cards[2];
  82. };
  83.  
  84.  
  85. bool is_straight(const card* cards)
  86. {
  87. if (CV(0) == 2 && cards[1].value == 3 && cards[2].value == 4 && cards[3].value == 5 && cards[4].value == 14) {
  88. return true;
  89. }
  90.  
  91. int fval = CV(0);
  92. FOR(i,1,4) {
  93. if (fval + i != cards[i].value) {
  94. return false;
  95. }
  96. }
  97. return true;
  98. }
  99.  
  100.  
  101. // cards: 5 cards sorted by value
  102. int get_score(const card* cards)
  103. {
  104. // royal flush
  105. if (same_color(cards, 5) && is_straight(cards)) {
  106. return 10000000 + cards[3].value;
  107. }
  108.  
  109. // poker
  110. int mid = cards[2].value;
  111. bool pokerBroken = false;
  112. FOR(i,0,3) {
  113. if (cards[i].value != mid) {
  114. pokerBroken = true;
  115. break;
  116. }
  117. }
  118. if (!pokerBroken) {
  119. return 9000000 + mid;
  120. }
  121. // for i, 1, 4
  122. pokerBroken = false;
  123. FOR(i,1,4) {
  124. if (cards[i].value != mid) {
  125. pokerBroken = true;
  126. break;
  127. }
  128. }
  129. if (!pokerBroken) {
  130. return 9000000 + mid;
  131. }
  132.  
  133. // full house
  134. if (cards[0].value == cards[1].value && cards[3].value == cards[4].value) {
  135. if (cards[2].value == cards[0].value || cards[2].value == cards[4].value) {
  136. return 8000000 + 15*cards[2].value;
  137. }
  138. }
  139.  
  140. // flush
  141. if (same_color(cards, 5)) {
  142. return 7000000 + 15*15*15*15*cards[4].value + 15*15*15*cards[3].value + 15*15*cards[2].value + 15*cards[1].value + cards[0].value;
  143. }
  144.  
  145. // straight
  146. if (is_straight(cards)) {
  147. if (CV(0) == 2 && CV(4) == 14) {
  148. return 6000000 + 4;
  149. }
  150. else {
  151. return 6000000 + cards[3].value;
  152. }
  153. }
  154.  
  155. // three
  156. if (cards[0].value == mid && cards[1].value == mid) {
  157. return 5000000 + mid * 15*15 + cards[4].value*15 + cards[3].value;
  158. }
  159. if (cards[1].value == mid && cards[3].value == mid) {
  160. return 5000000 + mid * 15*15 + cards[4].value*15 + cards[0].value;
  161. }
  162. if (cards[3].value == mid && cards[4].value == mid) {
  163. return 5000000 + mid * 15*15 + cards[1].value*15 + cards[0].value;
  164. }
  165.  
  166. // two pairs
  167. if (cards[1].value == cards[2].value && cards[3].value == cards[4].value) {
  168. return 4000000 + 15 * 15 * cards[3].value + 15*cards[1].value + cards[0].value;
  169. }
  170. if (cards[0].value == cards[1].value && cards[3].value == cards[4].value) {
  171. return 4000000 + 15 * 15 * cards[3].value + 15*cards[1].value + cards[2].value;
  172. }
  173. if (cards[0].value == cards[1].value && cards[2].value == cards[3].value) {
  174. return 4000000 + 15 * 15 * cards[3].value + 15*cards[1].value + cards[4].value;
  175. }
  176.  
  177. // pair
  178. if (CV(0) == CV(1)) {
  179. return 3000000 + 15*15*15*CV(0) + 15*15*CV(4) + 15*CV(3) + CV(2);
  180. }
  181. if (CV(1) == CV(2)) {
  182. return 3000000 + 15*15*15*CV(1) + 15*15*CV(4) + 15*CV(3) + CV(0);
  183. }
  184. if (CV(2) == CV(3)) {
  185. return 3000000 + 15*15*15*CV(2) + 15*15*CV(4) + 15*CV(1) + CV(0);
  186. }
  187. if (CV(3) == CV(4)) {
  188. return 3000000 + 15*15*15*CV(3) + 15*15*CV(2) + 15*CV(1) + CV(0);
  189. }
  190.  
  191. // one card
  192. return 15*15*15*15*CV(4) + 15*15*15*CV(3) + 15*15*CV(2) + 15*CV(1) + CV(0);
  193. }
  194.  
  195.  
  196. int get_score(const player& pl, const card table[])
  197. {
  198. // try all possibilities
  199. card allcards[7] = {pl.cards[0], pl.cards[1]};
  200. FOR(i,0,4) allcards[i+2] = table[i];
  201.  
  202. int bestScore = 0;
  203.  
  204. FOR(i,0,6) {
  205. FOR(j,i+1,6) {
  206. // skip i and j
  207. card cards[5];
  208. int nextIdx = 0;
  209. FOR(k,0,6) {
  210. if (k != i && k != j) {
  211. cards[nextIdx++] = allcards[k];
  212. }
  213. }
  214. sort(cards, cards+4);
  215. int sc = get_score(cards);
  216. bestScore = max(bestScore, sc);
  217. }
  218. }
  219.  
  220. return bestScore;
  221. }
  222.  
  223.  
  224. void printvec(vector<int> v)
  225. {
  226. FOREACH(i,v) {
  227. cerr << *i << " ";
  228. }
  229. }
  230.  
  231. void print_card(const card& c)
  232. {
  233. cerr << c.value << c.color << " ";
  234. }
  235.  
  236.  
  237.  
  238. int main(void)
  239. {
  240. int playersCnt;
  241. GETI(playersCnt);
  242.  
  243.  
  244. card cds[][5] = {
  245. { card('9', 'a'),card('9', 'b'),card('9', 'c'),card('9', 'd'),card('X','a')},
  246. { card('9', 'a'),card('9', 'b'),card('9', 'c'),card('9', 'd'),card('8','a')},
  247. { card('9', 'a'),card('9', 'b'),card('X', 'c'),card('X', 'd'),card('A','a')},
  248. { card('9', 'a'),card('9', 'b'),card('X', 'c'),card('X', 'd'),card('Q','a')},
  249. { card('2', 'a'),card('5', 'a'),card('6', 'a'),card('8', 'a'),card('9','a')},
  250. { card('3', 'a'),card('4', 'a'),card('7', 'a'),card('9', 'a'),card('A','a')},
  251. { card('2', 'a'),card('3', 'a'),card('4', 'a'),card('5', 'a'),card('6','a')},
  252. { card('2', 'a'),card('3', 'a'),card('4', 'a'),card('5', 'a'),card('A','a')},
  253. { card('2', 'b'),card('3', 'c'),card('4', 'a'),card('5', 'd'),card('A','a')},
  254. { card('2', 'b'),card('3', 'c'),card('4', 'a'),card('5', 'd'),card('6','a')},
  255. { card('2', 'a'),card('5', 'a'),card('6', 'a'),card('8', 'a'),card('9','a')},
  256.  
  257. };
  258. // FORARR(i,cds) {
  259. // cerr << i << ": " << get_score(cds[i]) << endl;
  260. // }
  261.  
  262.  
  263. while (!feof(stdin)) {
  264.  
  265. // cerr << "---------------------------------------" << endl;
  266. // cerr << "playersCnt: " << playersCnt << endl;
  267.  
  268. card table[5];
  269. FOR(i,0,4) {
  270. char val, color;
  271. scanf("%c %c ", &val, &color);
  272. table[i] = card(val, color);
  273. }
  274. // cerr << "Table: "; FOR(i,0,4) print_card(table[i]); cerr << endl;
  275.  
  276. vector<player> players(playersCnt);
  277. FOR(i,0,playersCnt-1) {
  278. player pl;
  279. FOR(j,0,1) {
  280. char val, color;
  281. scanf("%c %c ", &val, &color);
  282. pl.cards[j] = card(val, color);
  283. }
  284. players[i] = pl;
  285.  
  286. // cerr << "Player " << i << ": "; FOR(j,0,1) print_card(pl.cards[j]); cerr << endl;
  287. }
  288.  
  289.  
  290.  
  291. // --------------------------------------------------
  292.  
  293. vector<int> bestPlayers;
  294. int bestScore = 0;
  295. FOR(i,0,playersCnt-1) {
  296. int score = get_score(players[i], table);
  297. if (score > bestScore) {
  298. bestScore = score;
  299. bestPlayers.clear();
  300. bestPlayers.push_back(i);
  301. }
  302. else if (score == bestScore) {
  303. bestPlayers.push_back(i);
  304. }
  305. // cerr << "i: " << i << ", bestPlayers: "; printvec(bestPlayers); cerr << endl;
  306. }
  307.  
  308. // cerr << "best score: " << bestScore << endl;
  309.  
  310. if (bestPlayers.size() == 1) {
  311. cout << bestPlayers[0]+1 << endl;
  312. }
  313. else {
  314. cout << bestPlayers[0]+1;
  315. FOR(i,1,(int)bestPlayers.size()-1) {
  316. cout << " " << bestPlayers[i]+1;
  317. }
  318. cout << endl;
  319. }
  320.  
  321.  
  322.  
  323. GETI(playersCnt);
  324. }
  325.  
  326.  
  327.  
  328.  
  329. return 0;
  330. }
  331.  

Diff to submission s1296

r.cpp

--- c4.s1296.cteam092.rhino.cpp.0.r.cpp
+++ c4.s1370.cteam092.rhino.cpp.0.r.cpp
@@ -85,5 +85,5 @@
 bool is_straight(const card* cards)
 {
-  if (cards[0].value == 1 && cards[1].value == 2 && cards[2].value == 3 && cards[3].value == 4 && cards[4].value == 14) {
+  if (CV(0) == 2 && cards[1].value == 3 && cards[2].value == 4 && cards[3].value == 5 && cards[4].value == 14) {
     return true;
   }
@@ -145,5 +145,10 @@
   // straight
   if (is_straight(cards)) {
-    return 6000000 + cards[3].value;
+    if (CV(0) == 2 && CV(4) == 14) {
+      return 6000000 + 4;
+    }
+    else {
+      return 6000000 + cards[3].value;
+    }
   }
   
@@ -236,4 +241,24 @@
     GETI(playersCnt);
     
+    
+    card cds[][5] = {
+      { card('9', 'a'),card('9', 'b'),card('9', 'c'),card('9', 'd'),card('X','a')},
+      { card('9', 'a'),card('9', 'b'),card('9', 'c'),card('9', 'd'),card('8','a')},
+      { card('9', 'a'),card('9', 'b'),card('X', 'c'),card('X', 'd'),card('A','a')},
+      { card('9', 'a'),card('9', 'b'),card('X', 'c'),card('X', 'd'),card('Q','a')},
+      { card('2', 'a'),card('5', 'a'),card('6', 'a'),card('8', 'a'),card('9','a')},
+      { card('3', 'a'),card('4', 'a'),card('7', 'a'),card('9', 'a'),card('A','a')},
+      { card('2', 'a'),card('3', 'a'),card('4', 'a'),card('5', 'a'),card('6','a')},
+      { card('2', 'a'),card('3', 'a'),card('4', 'a'),card('5', 'a'),card('A','a')},
+      { card('2', 'b'),card('3', 'c'),card('4', 'a'),card('5', 'd'),card('A','a')},
+      { card('2', 'b'),card('3', 'c'),card('4', 'a'),card('5', 'd'),card('6','a')},
+      { card('2', 'a'),card('5', 'a'),card('6', 'a'),card('8', 'a'),card('9','a')},
+      
+    };
+//     FORARR(i,cds) {
+//       cerr << i << ": " << get_score(cds[i]) << endl;
+//     }
+    
+    
     while (!feof(stdin)) {