题目链接: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区域网络赛沈阳站)相关推荐

  1. B. super_log(2019ICPC区域网络赛南京站)

    题目链接:https://nanti.jisuanke.com/t/41299 题目大意 已知函数loga∗log_a^*loga∗​形式如下: loga∗(x)={−1, if x<11+lo ...

  2. 计蒜客 41408 Texas hold‘em Poker 模拟

    Texas hold'em Poker Source: The Preliminary Contest for ICPC Asia Shenyang 2019 H Link: Texas hold'e ...

  3. 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 ...

  4. The Preliminary Contest for ICPC Asia Nanjing 2019ICPC南京网络赛

    B.super_log (欧拉降幂) •题意 定一个一个运算log*,迭代表达式为 给定一个a,b计算直到迭代结果>=b时,最小的x,输出对m取余后的值 •思路 $log*_{a}(a^{a}) ...

  5. 【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 ...

  6. 【2019.09.08】2019icpc南昌网络赛

    题目地址:https://www.jisuanke.com/contest/3870?view=challenges A: B: C: D: E: F: G: H: I: 转载于:https://ww ...

  7. 2019icpc南京网络赛 Holy Grail(SPFA)

    题目链接---- 我至今还对题意有点模棱两可,不过也大致是知道了... 大致是一开始给你一个有向图,然后让你给你六个顶点,添六条边,但是添边是有限制的.每次添边的权值要最小,还有个条件就是不能构成ne ...

  8. 2019ICPC上海网络赛A 边分治+线段树

    题目: 给定一棵树, 带边权. 现在有2种操作: 1.修改第i条边的权值. 2.询问u到其他一个任意点的最大距离是多少. 解法:边分治+线段树 首先我们将所有的点修改和边修改都存在对应的边里面. 然后 ...

  9. 2019 icpc徐州区域网络赛题解09.07

    A题: 链接:https://nanti.jisuanke.com/t/41383 思路:模型是经典常见的斐波拉契博弈模型,套上一个java大数的扩展中国剩余定理即可. 扩展中国剩余定理解出方程,判断 ...

最新文章

  1. BigData之MongoDB:MongoDB基于分布式文件存储数据库的简介、下载、案例应用之详细攻略
  2. 机器学习 感知机算法_0(Matlab实现)
  3. CodeForces - 1543D2 RPD and Rap Sheet (Hard Version)(交互+模拟)
  4. spring序列化_使用@JsonIdentityInfo的Spring自定义序列化器
  5. ccf命令行选项只能用c实现_CCF-201403-3-命令行选项
  6. 【转】ABP源码分析三十二:ABP.SignalR
  7. python工作目录_Python目录的基本操作
  8. 数组中最大连续子数组和,最大连续子数组积,最大递增子序列
  9. Vista初级使用技巧及故障总结
  10. 健康医疗数据库建设亟需“万象更新”式变革
  11. 逆天了!小米将首发一亿像素手机
  12. C#_MVC 自定义AuthorizeAttribute实现权限管理
  13. vue项目中微信分享安卓正常,ios报签名错误
  14. IDEA 集成Statistic插件
  15. 数据结构基础 之 递归算法实例讲解
  16. 打开微信开发者工具后无法显示文件的问题解决方案
  17. 原文 葛底斯堡宣言_如何有感情地背下葛底斯堡演说的全文?
  18. 视频教程-微信小程序商城15天从零实战课程-微信开发
  19. Android仿斗鱼滑动登录验证
  20. 利用GDI+基于WIN32实现桌面雪花效果(一)

热门文章

  1. ida demangled names
  2. 进程间通信——DLL共享节
  3. PE结构基址重定位表
  4. 手把手教你配置Kali Linux
  5. C++11 运行时变量类型判断
  6. C语言自己写得到文件大小的函数已及Python
  7. Windows x64内核学习笔记(五)—— KPTI(未完待续)
  8. pwn学习总结(二) —— 基础知识(持续更新)
  9. 6、mysqldump备份数据库(附带实例)
  10. 13、 LEFT/RIGHT JOIN:外连接(左连接,右连接)