Source code for submission s1296

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 (cards[0].value == 1 && cards[1].value == 2 && cards[2].value == 3 && cards[3].value == 4 && 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. return 6000000 + cards[3].value;
  148. }
  149.  
  150. // three
  151. if (cards[0].value == mid && cards[1].value == mid) {
  152. return 5000000 + mid * 15*15 + cards[4].value*15 + cards[3].value;
  153. }
  154. if (cards[1].value == mid && cards[3].value == mid) {
  155. return 5000000 + mid * 15*15 + cards[4].value*15 + cards[0].value;
  156. }
  157. if (cards[3].value == mid && cards[4].value == mid) {
  158. return 5000000 + mid * 15*15 + cards[1].value*15 + cards[0].value;
  159. }
  160.  
  161. // two pairs
  162. if (cards[1].value == cards[2].value && cards[3].value == cards[4].value) {
  163. return 4000000 + 15 * 15 * cards[3].value + 15*cards[1].value + cards[0].value;
  164. }
  165. if (cards[0].value == cards[1].value && cards[3].value == cards[4].value) {
  166. return 4000000 + 15 * 15 * cards[3].value + 15*cards[1].value + cards[2].value;
  167. }
  168. if (cards[0].value == cards[1].value && cards[2].value == cards[3].value) {
  169. return 4000000 + 15 * 15 * cards[3].value + 15*cards[1].value + cards[4].value;
  170. }
  171.  
  172. // pair
  173. if (CV(0) == CV(1)) {
  174. return 3000000 + 15*15*15*CV(0) + 15*15*CV(4) + 15*CV(3) + CV(2);
  175. }
  176. if (CV(1) == CV(2)) {
  177. return 3000000 + 15*15*15*CV(1) + 15*15*CV(4) + 15*CV(3) + CV(0);
  178. }
  179. if (CV(2) == CV(3)) {
  180. return 3000000 + 15*15*15*CV(2) + 15*15*CV(4) + 15*CV(1) + CV(0);
  181. }
  182. if (CV(3) == CV(4)) {
  183. return 3000000 + 15*15*15*CV(3) + 15*15*CV(2) + 15*CV(1) + CV(0);
  184. }
  185.  
  186. // one card
  187. return 15*15*15*15*CV(4) + 15*15*15*CV(3) + 15*15*CV(2) + 15*CV(1) + CV(0);
  188. }
  189.  
  190.  
  191. int get_score(const player& pl, const card table[])
  192. {
  193. // try all possibilities
  194. card allcards[7] = {pl.cards[0], pl.cards[1]};
  195. FOR(i,0,4) allcards[i+2] = table[i];
  196.  
  197. int bestScore = 0;
  198.  
  199. FOR(i,0,6) {
  200. FOR(j,i+1,6) {
  201. // skip i and j
  202. card cards[5];
  203. int nextIdx = 0;
  204. FOR(k,0,6) {
  205. if (k != i && k != j) {
  206. cards[nextIdx++] = allcards[k];
  207. }
  208. }
  209. sort(cards, cards+4);
  210. int sc = get_score(cards);
  211. bestScore = max(bestScore, sc);
  212. }
  213. }
  214.  
  215. return bestScore;
  216. }
  217.  
  218.  
  219. void printvec(vector<int> v)
  220. {
  221. FOREACH(i,v) {
  222. cerr << *i << " ";
  223. }
  224. }
  225.  
  226. void print_card(const card& c)
  227. {
  228. cerr << c.value << c.color << " ";
  229. }
  230.  
  231.  
  232.  
  233. int main(void)
  234. {
  235. int playersCnt;
  236. GETI(playersCnt);
  237.  
  238. while (!feof(stdin)) {
  239.  
  240. // cerr << "---------------------------------------" << endl;
  241. // cerr << "playersCnt: " << playersCnt << endl;
  242.  
  243. card table[5];
  244. FOR(i,0,4) {
  245. char val, color;
  246. scanf("%c %c ", &val, &color);
  247. table[i] = card(val, color);
  248. }
  249. // cerr << "Table: "; FOR(i,0,4) print_card(table[i]); cerr << endl;
  250.  
  251. vector<player> players(playersCnt);
  252. FOR(i,0,playersCnt-1) {
  253. player pl;
  254. FOR(j,0,1) {
  255. char val, color;
  256. scanf("%c %c ", &val, &color);
  257. pl.cards[j] = card(val, color);
  258. }
  259. players[i] = pl;
  260.  
  261. // cerr << "Player " << i << ": "; FOR(j,0,1) print_card(pl.cards[j]); cerr << endl;
  262. }
  263.  
  264.  
  265.  
  266. // --------------------------------------------------
  267.  
  268. vector<int> bestPlayers;
  269. int bestScore = 0;
  270. FOR(i,0,playersCnt-1) {
  271. int score = get_score(players[i], table);
  272. if (score > bestScore) {
  273. bestScore = score;
  274. bestPlayers.clear();
  275. bestPlayers.push_back(i);
  276. }
  277. else if (score == bestScore) {
  278. bestPlayers.push_back(i);
  279. }
  280. // cerr << "i: " << i << ", bestPlayers: "; printvec(bestPlayers); cerr << endl;
  281. }
  282.  
  283. // cerr << "best score: " << bestScore << endl;
  284.  
  285. if (bestPlayers.size() == 1) {
  286. cout << bestPlayers[0]+1 << endl;
  287. }
  288. else {
  289. cout << bestPlayers[0]+1;
  290. FOR(i,1,(int)bestPlayers.size()-1) {
  291. cout << " " << bestPlayers[i]+1;
  292. }
  293. cout << endl;
  294. }
  295.  
  296.  
  297.  
  298. GETI(playersCnt);
  299. }
  300.  
  301.  
  302.  
  303.  
  304. return 0;
  305. }
  306.