codeforce gym 101726 problem D Poker

D. Poker
time limit per test
2.0 s
memory limit per test
256 MB
input
standard input
output
standard output

Poker is played with a standard 52-card deck (13 ranks and 4 suits). The ranks of the cards, in increasing order, are: 2, 3, ..., 10, Jack, Queen, King and Ace. Given a poker table, with two players, your task is to determine the winner.

Each player has two cards in his hand and there are five common cards to both players. Whichever player has the most valuable 5-card hand, choosing from his own cards and the one on the table, wins. A card on the table may be used by both players at the same time and a player may ignore zero, one or both of his own cards.

To determine the value of a 5-card hand, it is identified as one of the hand types listed below. If the same hand fits more than one type, the most valuable one is chosen. If both players' hands fit the same type, the tie is broken by some rule specific to that type.

The type list, from least to most valuable, and their respective tie-breaking rule are:

  • Highest card: If the hand does not fit any of the other types. To break the tie, the five cards are compared, one by one, from highest to lowest rank, until one hand has a higher card then the other;
  • One pair: Two cards of the same rank. The tie-breaker is similar the rule in Highest card, first comparing the pair, and then the other three cards;
  • Two pairs: Two pairs of different rank. The tie-breaker is first by the most valuable pair, then by the second, then by the last card;
  • Three of a kind: Three cards of the same rank. The tie-breaker is analogous to the one in One pair, first compare the triple, then the other two cards;
  • Straight: Five cards in a sequence. In this case, the Ace may be either the highest rank (after the King) or the lowest (before the 2). The tie-breaker is done by the card of highest rank, considering that Ace has the lowest rank if it comes before a 2;
  • Flush: Five cards of the same suit. The tie-breaker is done like in Highest card;
  • Full House: A three of a kind with a pair. The tie-breaker is done by the rank of the three of a kind, and then by the pair;
  • Four of a kind: Four cards of the same rank. The tie-breaker is done by the rank of the four of a kind, and then by the last card;
  • Straight Flush: Straight and Flush at the same time. The tie-breaker is the same as in Straight.

    Notice that it is possible for the tie to persist even after the tie-breaker rules are applied. The suits of a card are only used to define a Flush, and are not used in any tie-breaker rule.

Input

On the first line, an integer T, the number of test cases.

Each test case is given in three lines. The first two lines have the description of two cards each, the cards of the first player, and of the second. The last line has the description of five cards, the cards on the table.

The description of each card is given by two characters, the rank and the suit, as given in the table.

Limits

  • 1 ≤ T ≤ 105
  • For each test case, all cards are valid and distinct.
Output

For each test, print 1 if the first player wins, 2 if the second player wins, and 0 if there is a tie, even after applying the tie-breaker rules.

Example
input
Copy
3
Ts Js
Tc Jc
Qs Qc Ks Kc As
As 7d
Ah 8s
Ac Ad 9s Jh Kc
As 7d
Ah 8s
Ac Ad 6s 3h Kc
output
Copy
1
0
2
思路:按规则模拟即可。判断当前是什么类型优先判断是否满足等级高的类别。
  1 #include <iostream>
  2 #include <fstream>
  3 #include <sstream>
  4 #include <cstdlib>
  5 #include <cstdio>
  6 #include <cmath>
  7 #include <string>
  8 #include <cstring>
  9 #include <algorithm>
 10 #include <queue>
 11 #include <stack>
 12 #include <vector>
 13 #include <set>
 14 #include <map>
 15 #include <list>
 16 #include <iomanip>
 17 #include <cctype>
 18 #include <cassert>
 19 #include <bitset>
 20 #include <ctime>
 21 
 22 using namespace std;
 23 
 24 #define pau system("pause")
 25 #define ll long long
 26 #define pii pair<int, int>
 27 #define pb push_back
 28 #define mp make_pair
 29 #define clr(a, x) memset(a, x, sizeof(a))
 30 
 31 const double pi = acos(-1.0);
 32 const int INF = 0x3f3f3f3f;
 33 const int MOD = 1e9 + 7;
 34 const double EPS = 1e-9;
 35 
 36 /*
 37 #include <ext/pb_ds/assoc_container.hpp>
 38 #include <ext/pb_ds/tree_policy.hpp>
 39 
 40 using namespace __gnu_pbds;
 41 tree<pli, null_type, greater<pli>, rb_tree_tag, tree_order_statistics_node_update> T;
 42 */
 43 
 44 int t;
 45 struct gg {
 46     int v, co;
 47     gg () {}
 48     gg (int v, int co) : v(v), co(co) {}
 49     void input() {
 50         char c = getchar();
 51         while (!isalpha(c) && !isdigit(c)) c = getchar();
 52         if ('T' == c) {
 53             v = 10;
 54         } else if ('J' == c) {
 55             v = 11;
 56         } else if ('Q' == c) {
 57             v = 12;
 58         } else if ('K' == c) {
 59             v = 13;
 60         } else if ('A' == c) {
 61             v = 14;
 62         } else {
 63             v = c - '0';
 64         }
 65         co = getchar();
 66     }
 67     bool operator < (const gg &g) const {
 68         return v < g.v;
 69     }
 70 } g1[10], g2[10];
 71 struct hh {
 72     int type;
 73     gg g[5];
 74     void modify() {
 75         sort(g, g + 5);
 76     }
 77     void output() {
 78         printf("type = %d ", type);
 79         for (int i = 0; i < 5; ++i) {
 80             printf("%d %c ", g[i].v, g[i].co);
 81         }
 82         puts("");
 83     }
 84     int is_flush() const {
 85         for (int i = 1; i < 5; ++i) {
 86             if (g[i].co != g[0].co) return 0;
 87         }
 88         return g[4].v;
 89     }
 90     int is_straight() const {
 91         int f = 1;
 92         for (int i = 3; ~i; --i) {
 93             if (g[i].v != g[i + 1].v - 1) {
 94                 f = 0;
 95                 break;
 96             }
 97         }
 98         if (f) return g[4].v;
 99         f = 1;
100         if (14 == g[4].v) {
101             for (int i = 0; i < 4; ++i) {
102                 if (g[i].v != i + 2) {
103                     f = 0;
104                     break;
105                 }
106             }
107         } else {
108             f = 0;
109         }
110         return f ? 5 : 0;
111     }
112     int is_pair() const {
113         int i;
114         for (i = 4; i; --i) {
115             if (g[i].v == g[i - 1].v && (1 == i || g[i].v != g[i - 2].v) && (4 == i || g[i].v != g[i + 1].v)) {
116                 break;
117             }
118         }
119         if (i) {
120             int res = g[i].v;
121             for (int j = 4; ~j; --j) {
122                 if (i == j || i - 1 == j) continue;
123                 res = res * 20 + g[j].v;
124             }
125             return res;
126         }
127         return 0;
128     }
129     int is_triple() const {
130         if (g[4].v == g[2].v) return g[4].v * 400 + g[1].v * 20 + g[0].v;
131         if (g[3].v == g[1].v) return g[3].v * 400 + g[4].v * 20 + g[0].v;
132         if (g[2].v == g[0].v) return g[2].v * 400 + g[4].v * 20 + g[3].v;
133         return 0;
134     }
135     int is_fouple() const {
136         if (g[4].v == g[1].v) return g[4].v * 20 + g[0].v;
137         if (g[3].v == g[0].v) return g[3].v * 20 + g[4].v;
138         return 0;
139     }
140     int is_two_pair() const {
141         if (g[4].v == g[3].v && g[2].v == g[1].v) return g[4].v * 400 + g[2].v * 20 + g[0].v;
142         if (g[4].v == g[3].v && g[1].v == g[0].v) return g[4].v * 400 + g[1].v * 20 + g[2].v;
143         if (g[3].v == g[2].v && g[1].v == g[0].v) return g[3].v * 400 + g[1].v * 20 + g[4].v;
144         return 0;
145     }
146     pii is_house() const {
147         if (g[4].v == g[2].v && g[1].v == g[0].v) return pii(g[4].v, g[1].v);
148         if (g[4].v == g[3].v && g[2].v == g[0].v) return pii(g[2].v, g[4].v);
149         return pii(0, 0);
150     }
151     int get_type() const {
152         int ff = is_flush();
153         int fs = is_straight();
154         int fp = is_pair();
155         int ft = is_triple();
156         if (fs) {
157             return ff ? 9 : 5;
158         } else if (is_fouple()) {
159             return 8;
160         } else if (fp && ft) {
161             return 7;
162         } else if (ff) {
163             return 6;
164         } else if (ft) {
165             return 4;
166         } else if (is_two_pair()) {
167             return 3;
168         } else if (is_pair()) {
169             return 2;
170         } else {
171             return 1;
172         }
173     }
174     bool operator < (const hh h) const {
175         if (type != h.type) return type < h.type;
176         if (1 == type) {
177             for (int i = 4; ~i; --i) {
178                 if (g[i].v != h.g[i].v) return g[i].v < h.g[i].v;
179             }
180             return false;
181         } else if (2 == type) {
182             return is_pair() < h.is_pair();
183         } else if (3 == type) {
184             return is_two_pair() < h.is_two_pair();
185         } else if (4 == type) {
186             return is_triple() < h.is_triple();
187         } else if (5 == type) {
188             return is_straight() < h.is_straight();
189         } else if (6 == type) {
190             for (int i = 4; ~i; --i) {
191                 if (g[i].v != h.g[i].v) return g[i].v < h.g[i].v;
192             }
193             return false;
194         } else if (7 == type) {
195             return is_house() < h.is_house();
196         } else if (8 == type) {
197             return is_fouple() < h.is_fouple();
198         } else {
199             return is_straight() < h.is_straight();
200         }
201     }
202 } h1, h2, th;
203 int main() {
204     scanf("%d", &t);
205     while (t--) {
206         g1[1].input(), g1[2].input();
207         g2[1].input(), g2[2].input();
208         for (int i = 1; i <= 5; ++i) {
209             g1[i + 2].input();
210             g2[i + 2] = g1[i + 2];
211         }
212         h1.type = h2.type = 0;
213         for (int i = 1; i <= 7; ++i) {
214             for (int j = i + 1; j <= 7; ++j) {
215                 for (int k = 1, l = 0; k <= 7; ++k) {
216                     if (k == i || k == j) continue;
217                     th.g[l++] = g1[k];
218                 }
219                 th.modify();
220                 th.type = th.get_type();
221                 if (h1 < th) {
222                     h1.type = th.type;
223                     for (int i = 0; i < 5; ++i) {
224                         h1.g[i] = th.g[i];
225                     }
226                 }
227             }
228         }
229         for (int i = 1; i <= 7; ++i) {
230             for (int j = i + 1; j <= 7; ++j) {
231                 for (int k = 1, l = 0; k <= 7; ++k) {
232                     if (k == i || k == j) continue;
233                     th.g[l++] = g2[k];
234                 }
235                 th.modify();
236                 th.type = th.get_type();
237                 if (h2 < th) {
238                     h2.type = th.type;
239                     for (int i = 0; i < 5; ++i) {
240                         h2.g[i] = th.g[i];
241                     }
242                 }
243             }
244         }
245         //h1.output(), h2.output();
246         if (h1 < h2) puts("2");
247         else if (h2 < h1) puts("1");
248         else puts("0");
249     }
250     return 0;
251 }
252 /*
253 111
254 9h 8h
255 Jc 9d
256 9s 4d Ts Ad As
257 */
View Code

 

转载于:https://www.cnblogs.com/BIGTOM/p/8969352.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
未来社区的建设背景和需求分析指出,随着智能经济、大数据、人工智能、物联网、区块链、云计算等技术的发展,社区服务正朝着数字化、智能化转型。社区服务渠道由分散向统一融合转变,服务内容由通用庞杂向个性化、服务导向转变。未来社区将构建数字化生态,实现数据在线、组织在线、服务在线、产品智能和决策智能,赋能企业创新,同时注重人才培养和科研平台建设。 规划设计方面,未来社区将基于居民需求,打造以服务为中心的社区管理模式。通过统一的服务平台和应用,实现服务内容的整合和优化,提供灵活多样的服务方式,如推送式、订阅式、热点式等。社区将构建数据与应用的良性循环,提高服务效率,同时注重生态优美、绿色低碳、社会和谐,以实现幸福民生和产业发展。 建设运营上,未来社区强调科学规划、以人为本,创新引领、重点突破,统筹推进、整体提升。通过实施院落+社团自治工程,转变政府职能,深化社区自治法制化、信息化,解决社区治理中的重点问题。目标是培养有活力的社会组织,提高社区居民参与度和满意度,实现社区治理服务的制度机制创新。 未来社区的数字化解决方案包括信息发布系统、服务系统和管理系统。信息发布系统涵盖公共服务类和社会化服务类信息,提供政策宣传、家政服务、健康医疗咨询等功能。服务系统功能需求包括办事指南、公共服务、社区工作参与互动等,旨在提高社区服务能力。管理系统功能需求则涉及院落管理、社团管理、社工队伍管理等,以实现社区治理的现代化。 最后,未来社区建设注重整合政府、社会组织、企业等多方资源,以提高社区服务的效率和质量。通过建立社区管理服务综合信息平台,提供社区公共服务、社区社会组织管理服务和社区便民服务,实现管理精简、高效、透明,服务快速、便捷。同时,通过培育和发展社区协会、社团等组织,激发社会化组织活力,为居民提供综合性的咨询和服务,促进社区的和谐发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值