H. Texas hold'em Poker(2019ICPC区域网络赛沈阳站)
题目链接:https://nanti.jisuanke.com/t/41408
题目大意
输入各个玩家的姓名和手中持有的扑克牌,根据玩家的手中扑克牌的大小(规则如题)对玩家从大到小排序。如果有玩家的牌一样,这些玩家就按照姓名的字典序从小到大排序。最后输出排序后的玩家姓名。
题目分析
模拟题,基本上没有什么难点,只是这道题模拟的规模相对比较大,如果不注意细节就会比较容易犯错。下面是题目中用到的思路:
- 划分等级。给题目中提及到的套路等级规定相应的等级,判断完等级之后,只需要做一次排序就可以得到最后的答案。
- 分模块判断。对于玩家手中的牌,从大到小的等级顺序按模块判断手牌的等级。另外定义一个牌的特征数组,用于同等级扑克牌的比较。
黑历史记录:
- 又犯了大一天梯赛选拔赛时的错误,因为没有看清题意,看完样例直接开始做题,没有进行多组样例的输入。
- 没有看清楚题目。对于单张不同的牌,都是通过求和来比较大小,而不是通过我们平常那样。
- 数组越界。开了大小为15的数组,却访问了下标为15的元素,怕不是石乐志了。
代码如下
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <queue>
#define Mod 1000000007using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
struct Person {string name;int pork[10];int maxx[10];int ranking;
}p[maxn];int n;
string card;
map<string, int> vis;bool cmp(Person &A, Person &B) {if (A.ranking == B.ranking) {for (int i = 1; i <= 5; i++) {if (A.maxx[i] != B.maxx[i]) {return A.maxx[i] > B.maxx[i];}}return A.name < B.name;} else {return A.ranking > B.ranking;}
}void pre(int *a, int *b) {int idx = 0;for (int i = 0; i < card.length(); i++){if (card[i] == 'A') {a[++idx] = 1;} else if (card[i] == 'J'){a[++idx] = 11;} else if (card[i] == 'Q'){a[++idx] = 12;} else if (card[i] == 'K'){a[++idx] = 13;} else if (card[i] == '1'){a[++idx] = 10;i++;} else {a[++idx] = card[i] - '0';}}sort(a + 1, a + idx + 1);for (int i = 1; i <= 5; i++)b[i] = 0;
}bool isRoyal(int *a, int *b) {int idx = 0;if (a[++idx] != 1) return false;for (int i = 10; i < 14; i++)if (a[++idx] != i) return false;return true;
}bool isStraight(int *a, int *b) {for (int i = 1;i < 5; i++)if ((a[i] + 1) != a[i + 1])return false;b[1] = a[5];return true;
}
bool isFour(int *a, int *b) {int cnt[15], ans;memset(cnt, 0, sizeof(cnt));for (int i = 1; i <= 5; i++) cnt[a[i]]++;for (int i = 1; i < 15; i++)if (cnt[i] == 4) {b[1] = i;for (int j = 1; j <= 5; j++) if (a[j] != i) {b[2] = a[j];break;}return true;}return false;
}
bool isFull(int *a, int *b) {int cnt[15], num_1 = 0, num_2 = 0;memset(cnt, 0, sizeof(cnt));for (int i = 1; i <= 5; i++) cnt[a[i]]++;for (int i = 1; i < 15; i++) {if (cnt[i] == 3) num_1 = i;else if (cnt[i] == 2) num_2 = i;}if (num_1 && num_2) {b[1] = num_1;b[2] = num_2;return true;}return false;
}
bool isThree(int *a, int *b) {int cnt[15], num_1 = 0, num_2[3], num_3 = 0;memset(cnt, 0, sizeof(cnt));memset(num_2, 0, sizeof(num_2));for (int i = 1; i <= 5; i++) cnt[a[i]]++;for (int i = 1; i < 15; i++) {if (cnt[i] == 3) num_1 = i;else if (cnt[i] == 1) num_2[++num_3] = i;}if (num_1) {b[1] = num_1;b[2] = num_2[1] + num_2[2];return true;}return false;
}
bool isTwoPairs(int *a, int *b) {int cnt[15], num_1[3], num_2 = 0, num_3 = 0;memset(cnt, 0, sizeof(cnt));memset(num_1, 0, sizeof(num_1));for (int i = 1; i <= 5; i++) cnt[a[i]]++;for (int i = 1; i < 15; i++) {if (cnt[i] == 2) num_1[++num_3] = i;else if (cnt[i] == 1) num_2 = i;}if (num_3 == 2) {b[1] = num_1[2];b[2] = num_1[1];b[3] = num_2;return true;}return false;
}bool isPair(int *a, int *b) {int cnt[15], num_1 = 0, num_2[4], num_3 = 0;memset(cnt, 0, sizeof(cnt));memset(num_2, 0, sizeof(num_2));for (int i = 1; i <= 5; i++) cnt[a[i]]++;for (int i = 1; i < 15; i++) {if (cnt[i] == 2) num_1 = i;else if (cnt[i] == 1) num_2[++num_3] = i;}if (num_1) {b[1] = num_1;b[2] = num_2[1] + num_2[2] + num_2[3];return true;}return false;
}void judge(Person &p) {if (isRoyal(p.pork, p.maxx)) {p.ranking = 8;} else if (isStraight(p.pork, p.maxx)) {p.ranking = 7;} else if (isFour(p.pork, p.maxx)) {p.ranking = 6;} else if (isFull(p.pork, p.maxx)) {p.ranking = 5;} else if (isThree(p.pork, p.maxx)) {p.ranking = 4;} else if (isTwoPairs(p.pork, p.maxx)) {p.ranking = 3;} else if (isPair(p.pork, p.maxx)) {p.ranking = 2;} else {p.ranking = 1;for (int i = 1; i <= 5; i++) {p.maxx[1] += p.pork[i];}}
}int main()
{// freopen("t.txt", "r", stdin);ios::sync_with_stdio(false);cin.tie(0);while (cin >> n) {for (int i = 1; i <= n; i++) {cin >> p[i].name >> card;pre(p[i].pork, p[i].maxx);judge(p[i]);}sort(p + 1, p + n + 1, cmp);for (int i = 1; i <= n; i++)cout << p[i].name << endl;}return 0;
}
H. Texas hold'em Poker(2019ICPC区域网络赛沈阳站)相关推荐
- B. super_log(2019ICPC区域网络赛南京站)
题目链接:https://nanti.jisuanke.com/t/41299 题目大意 已知函数loga∗log_a^*loga∗形式如下: loga∗(x)={−1, if x<11+lo ...
- 计蒜客 41408 Texas hold‘em Poker 模拟
Texas hold'em Poker Source: The Preliminary Contest for ICPC Asia Shenyang 2019 H Link: Texas hold'e ...
- 2019ICPC南京网络赛A题 The beautiful values of the palace(三维偏序)
2019ICPC南京网络赛A题 The beautiful values of the palace https://nanti.jisuanke.com/t/41298 Here is a squa ...
- The Preliminary Contest for ICPC Asia Nanjing 2019ICPC南京网络赛
B.super_log (欧拉降幂) •题意 定一个一个运算log*,迭代表达式为 给定一个a,b计算直到迭代结果>=b时,最小的x,输出对m取余后的值 •思路 $log*_{a}(a^{a}) ...
- 【2019.09.15】2019icpc上海网络赛
题目地址:https://www.jisuanke.com/contest/3003?view=challenges A: B: C: D: E: F: G: H: I: J: K: L: 转载于:h ...
- 【2019.09.08】2019icpc南昌网络赛
题目地址:https://www.jisuanke.com/contest/3870?view=challenges A: B: C: D: E: F: G: H: I: 转载于:https://ww ...
- 2019icpc南京网络赛 Holy Grail(SPFA)
题目链接---- 我至今还对题意有点模棱两可,不过也大致是知道了... 大致是一开始给你一个有向图,然后让你给你六个顶点,添六条边,但是添边是有限制的.每次添边的权值要最小,还有个条件就是不能构成ne ...
- 2019ICPC上海网络赛A 边分治+线段树
题目: 给定一棵树, 带边权. 现在有2种操作: 1.修改第i条边的权值. 2.询问u到其他一个任意点的最大距离是多少. 解法:边分治+线段树 首先我们将所有的点修改和边修改都存在对应的边里面. 然后 ...
- 2019 icpc徐州区域网络赛题解09.07
A题: 链接:https://nanti.jisuanke.com/t/41383 思路:模型是经典常见的斐波拉契博弈模型,套上一个java大数的扩展中国剩余定理即可. 扩展中国剩余定理解出方程,判断 ...
最新文章
- BigData之MongoDB:MongoDB基于分布式文件存储数据库的简介、下载、案例应用之详细攻略
- 机器学习 感知机算法_0(Matlab实现)
- CodeForces - 1543D2 RPD and Rap Sheet (Hard Version)(交互+模拟)
- spring序列化_使用@JsonIdentityInfo的Spring自定义序列化器
- ccf命令行选项只能用c实现_CCF-201403-3-命令行选项
- 【转】ABP源码分析三十二:ABP.SignalR
- python工作目录_Python目录的基本操作
- 数组中最大连续子数组和,最大连续子数组积,最大递增子序列
- Vista初级使用技巧及故障总结
- 健康医疗数据库建设亟需“万象更新”式变革
- 逆天了!小米将首发一亿像素手机
- C#_MVC 自定义AuthorizeAttribute实现权限管理
- vue项目中微信分享安卓正常,ios报签名错误
- IDEA 集成Statistic插件
- 数据结构基础 之 递归算法实例讲解
- 打开微信开发者工具后无法显示文件的问题解决方案
- 原文 葛底斯堡宣言_如何有感情地背下葛底斯堡演说的全文?
- 视频教程-微信小程序商城15天从零实战课程-微信开发
- Android仿斗鱼滑动登录验证
- 利用GDI+基于WIN32实现桌面雪花效果(一)