B - 东东学打牌

题目描述

最近,东东沉迷于打牌。所以他找到 HRZ、ZJM 等人和他一起打牌。由于人数众多,东东稍微修改了亿下游戏规则:

所有扑克牌只按数字来算大小,忽略花色。
每张扑克牌的大小由一个值表示。A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K 分别指代 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13。
每个玩家抽得 5 张扑克牌,组成一手牌!(每种扑克牌的张数是无限的,你不用担心,东东家里有无数副扑克牌)
理所当然地,一手牌是有不同类型,并且有大小之分的。

举个栗子,现在东东的 “一手牌”(记为 α),瑞神的 “一手牌”(记为 β),要么 α > β,要么 α < β,要么 α = β。

那么这两个 “一手牌”,如何进行比较大小呢?首先对于不同类型的一手牌,其值的大小即下面的标号;对于同类型的一手牌,根据组成这手牌的 5 张牌不同,其值不同。下面依次列举了这手牌的形成规则:

  1. 大牌:这手牌不符合下面任一个形成规则。如果 α 和 β 都是大牌,那么定义它们的大小为组成这手牌的 5 张牌的大小总和。
  2. 对子:5 张牌中有 2 张牌的值相等。如果 α 和 β 都是对子,比较这个 “对子” 的大小,如果 α 和 β 的 “对子” 大小相等,那么比较剩下 3 张牌的总和。
  3. 两对:5 张牌中有两个不同的对子。如果 α 和 β 都是两对,先比较双方较大的那个对子,如果相等,再比较双方较小的那个对子,如果还相等,只能比较 5 张牌中的最后那张牌组不成对子的牌。
  4. 三个:5 张牌中有 3 张牌的值相等。如果 α 和 β 都是 “三个”,比较这个 “三个” 的大小,如果 α 和 β 的 “三个” 大小相等,那么比较剩下 2 张牌的总和。
  5. 三带二:5 张牌中有 3 张牌的值相等,另外 2 张牌值也相等。如果 α 和 β 都是 “三带二”,先比较它们的 “三个” 的大小,如果相等,再比较 “对子” 的大小。
  6. 炸弹:5 张牌中有 4 张牌的值相等。如果 α 和 β 都是 “炸弹”,比较 “炸弹” 的大小,如果相等,比较剩下那张牌的大小。
  7. 顺子:5 张牌中形成 x, x+1, x+2, x+3, x+4。如果 α 和 β 都是 “顺子”,直接比较两个顺子的最大值。
  8. 龙顺:5 张牌分别为 10、J、Q、K、A。

作为一个称职的魔法师,东东得知了全场人手里 5 张牌的情况。他现在要输出一个排行榜。排行榜按照选手们的 “一手牌” 大小进行排序,如果两个选手的牌相等,那么人名字典序小的排在前面。

不料,此时一束宇宙射线扫过,为了躲避宇宙射线,东东慌乱中清空了他脑中的 Cache。请你告诉东东,全场人的排名

Input

输入包含多组数据。每组输入开头一个整数 n (1 <= n <= 1e5),表明全场共多少人。
随后是 n 行,每行一个字符串 s1 和 s2 (1 <= |s1|,|s2| <= 10), s1 是对应人的名字,s2 是他手里的牌情况。

Output

对于每组测试数据,输出 n 行,即这次全场人的排名。

Sample Input

3
DongDong AAA109
ZJM 678910
Hrz 678910

Sample Output

Hrz
ZJM
DongDong

题解

结构体peop代表每个人和他手中的牌,根据题意,先比牌型,牌型相同则根据各牌型的规则比大小,牌完全相同比名字。所以这个结构体里有名字name,x代表牌型,y、z、w代表牌型里面的大小,比如两对这个牌型,y代表大的对子的大小,z代表小的对子的大小,w代表单个牌的大小。若其他牌型用不上这么多变量,则多余变量置0,比如龙顺时,x为8,y、z、w全为0。
一开始输入的时候调用cont()函数,算出牌型,把名字和代表牌型的数字变成结构体。所有插入完成后,用sort函数排序,然后依次输出peop数组中的名字即可。
注意不能连续使用等号(a= =b= =c),只能(a= =b&&b= =c),上次已经出错一次了,这次一开始还是写错了。
注意在调用函数时,不要把int*与int []混淆。
不知道为什么,对peop结构体排序时,使用结构体内重载<的方法 ,编译出错;使用重写cmp()函数的方法,编译通过。

代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string.h>
#include <string>
using namespace std;
char card[13] = { 'A','2','3','4','5','6','7','8','9','1','J','Q','K' };
struct peop {string name;int x, y, z, w;peop() {}peop(string nam, int a, int b, int c, int d) {name = nam; x = a; y = b; z = c; w = d;}
};
peop p[100010];
bool cmp(const peop& a, const peop& b) {//return a<b?1:0;if (a.x == b.x) {if (a.y == b.y) {if (a.z == b.z) {if (a.w == b.w) {return a.name < b.name ? 1 : 0;}else { return a.w > b.w; }}else { return a.z > b.z; }}else { return a.y > b.y; }}else { return a.x > b.x; }
}
bool shunzi(int sz[], int* a) {//顺子 if (sz[0] == sz[1] - 1 && sz[1] == sz[2] - 1 && sz[2] == sz[3] - 1 && sz[3] == sz[4] - 1) {a[0] = 7; a[1] = sz[4]; a[2] = 0; a[3] = 0;return 1;}return 0;
}bool longshun(int sz[], int* a) {//龙顺 if (sz[0] == 0 && sz[1] == 9 && sz[2] == 10 && sz[3] == 11 && sz[4] == 12) {a[0] = 8; a[1] = 0; a[2] = 0; a[3] = 0;return 1;}return 0;
}bool zhadan(int sz[], int* a) {//炸弹 if (sz[0] == sz[1] && sz[1] == sz[2] && sz[2] == sz[3]) {a[0] = 6; a[1] = sz[0]; a[2] = sz[4]; a[3] = 0;return 1;}if (sz[4] == sz[1] && sz[1] == sz[2] && sz[1] == sz[3]) {a[0] = 6; a[1] = sz[4]; a[2] = sz[0]; a[3] = 0;return 1;}return 0;
}bool sandaier(int sz[], int* a) {//三带二 if (sz[0] == sz[1] && sz[1] == sz[2] && sz[3] == sz[4]) {a[0] = 5; a[1] = sz[0]; a[2] = sz[4]; a[3] = 0;return 1;}if (sz[0] == sz[1] && sz[2] == sz[3] && sz[2] == sz[4]) {a[0] = 5; a[1] = sz[4]; a[2] = sz[0]; a[3] = 0;return 1;}return 0;
}bool sange(int sz[], int* a) {//三个if (sz[0] == sz[1] && sz[1] == sz[2]) {a[0] = 4; a[1] = sz[0]; a[2] = sz[3] + sz[4]; a[3] = 0;return 1;}if (sz[3] == sz[1] && sz[1] == sz[2]) {a[0] = 4; a[1] = sz[1]; a[2] = sz[0] + sz[4]; a[3] = 0;return 1;}if (sz[3] == sz[4] && sz[3] == sz[2]) {a[0] = 4; a[1] = sz[2]; a[2] = sz[1] + sz[0]; a[3] = 0;return 1;}return 0;
}bool liangdui(int sz[], int* a) {//两对 if (sz[0] == sz[1] && sz[2] == sz[3]) {if (sz[0] > sz[2]) {a[0] = 3; a[1] = sz[0]; a[2] = sz[2]; a[3] = sz[4];}else {a[0] = 3; a[1] = sz[2]; a[2] = sz[0]; a[3] = sz[4];}return 1;}if (sz[1] == sz[2] && sz[3] == sz[4]) {if (sz[3] > sz[2]) {a[0] = 3; a[1] = sz[3]; a[2] = sz[2]; a[3] = sz[0];}else {a[0] = 3; a[1] = sz[2]; a[2] = sz[3]; a[3] = sz[0];}return 1;}if (sz[0] == sz[1] && sz[3] == sz[4]) {if (sz[1] > sz[3]) {a[0] = 3; a[1] = sz[1]; a[2] = sz[3]; a[3] = sz[2];}else {a[0] = 3; a[1] = sz[3]; a[2] = sz[1]; a[3] = sz[2];}return 1;}return 0;
}bool duizi(int sz[], int* a) {//对子if (sz[0] == sz[1]) {a[0] = 2; a[1] = sz[1]; a[2] = sz[2] + sz[3] + sz[4]; a[3] = 0;return 1;}if (sz[1] == sz[2]) {a[0] = 2; a[1] = sz[1]; a[2] = sz[0] + sz[3] + sz[4]; a[3] = 0;return 1;}if (sz[2] == sz[3]) {a[0] = 2; a[1] = sz[2]; a[2] = sz[1] + sz[0] + sz[4]; a[3] = 0;return 1;}if (sz[3] == sz[4]) {a[0] = 2; a[1] = sz[3]; a[2] = sz[2] + sz[1] + sz[0]; a[3] = 0;return 1;}return 0;
}bool dapai(int sz[], int* a) {a[0] = 1; a[1] = sz[0] + sz[1] + sz[3] + sz[2] + sz[4];a[2] = 0; a[3] = 0;return 1;
}int* cont(int sz[]) {sort(sz, sz + 5);int* a = new int[4];if (shunzi(sz, a)) { return a; }if (longshun(sz, a)) { return a; }if (zhadan(sz, a)) { return a; }if (sandaier(sz, a)) { return a; }if (sange(sz, a)) { return a; }if (liangdui(sz, a)) { return a; }if (duizi(sz, a)) { return a; }dapai(sz, a);//cout<<a[0]<<endl;return a;
}
int main(int argc, char** argv) {int n; scanf("%d", &n);for (int i = 0; i < n; i++) {string nam;char b;int sz[5];//5张牌的大小 cin >> nam;//printf("%s\n",nam);for (int j = 0; j < 5; j++) {//scanf("%c",&b);cin >> b;//printf("输入了:%c\n",b);for (int k = 0; k < 13; k++) {if (b == card[k]) {if (b == '1') { scanf("%c", &b); }//把0拿进来sz[j] = k; break;}//cout<<"牌大小:"<<k<<endl; }//检查每张牌等于几 }//输入5张牌 int* a = cont(sz);p[i].name = nam;p[i].x = a[0]; p[i].y = a[1];p[i].z = a[2]; p[i].w = a[3];}//输入n个人和他们的牌 sort(p, p + n,cmp);for (int i = 0; i < n; i++) {cout << p[i].name << endl;//printf(" %d\n",p[i].x);}return 0;
}

WEEK9 作业 B - 东东学打牌相关推荐

  1. 【Week9作业 B】东东学打牌【模拟】

    题意: 最近,东东沉迷于打牌.所以他找到 HRZ.ZJM 等人和他一起打牌.由于人数众多,东东稍微修改了亿下游戏规则: 所有扑克牌只按数字来算大小,忽略花色. 每张扑克牌的大小由一个值表示.A, 2, ...

  2. 【Week9 作业】A - 咕咕东的目录管理器、B - 东东学打牌、C - 签到题,独立思考哈

    A - 咕咕东的目录管理器 题意: 咕咕东的雪梨电脑的操作系统在上个月受到宇宙射线的影响,时不时发生故障,他受不了了,想要写一个高效易用零bug的操作系统 -- 这工程量太大了,所以他定了一个小目标, ...

  3. B - 东东学打牌(Week9.2作业)

    题面 最近,东东沉迷于打牌.所以他找到 HRZ.ZJM 等人和他一起打牌.由于人数众多,东东稍微修改了亿下游戏规则: 所有扑克牌只按数字来算大小,忽略花色. 每张扑克牌的大小由一个值表示.A, 2, ...

  4. Week9 作业——B - 东东学打牌

    题目 最近,东东沉迷于打牌.所以他找到 HRZ.ZJM 等人和他一起打牌.由于人数众多,东东稍微修改了亿下游戏规则: 所有扑克牌只按数字来算大小,忽略花色. 每张扑克牌的大小由一个值表示.A, 2, ...

  5. 东东学打牌 Week9作业B题

    题目: 最近,东东沉迷于打牌.所以他找到 HRZ.ZJM 等人和他一起打牌.由于人数众多,东东稍微修改了亿下游戏规则: 所有扑克牌只按数字来算大小,忽略花色. 每张扑克牌的大小由一个值表示.A, 2, ...

  6. 程序设计思维 week9 作业B-东东学打牌

    目录 题目 Input Ouput Sample Input Sample Ouput 思路 代码 总结 题目 所有扑克牌只按数字来算大小,忽略花色. 每张扑克牌的大小由一个值表示.A, 2, 3, ...

  7. 程序设计Week9——B-东东学打牌

    B-东东学打牌 题目描述 Input Output 解题思路 实现代码 总结 题目描述 打牌,只考虑牌的数值,不考虑花色,每个人五张手牌,每种牌数量无限,手牌大小比较规则: 序号越大,牌越大,在得知全 ...

  8. [week9]东东学打牌

    文章目录 题意 Input Output 输入样例 输出样例 提示 分析 总结 代码 题意 最近,东东沉迷于打牌.所以他找到 HRZ.ZJM 等人和他一起打牌.由于人数众多,东东稍微修改了亿下游戏规则 ...

  9. week9 B-东东学打牌

    题面 最近,东东沉迷于打牌.所以他找到 HRZ.ZJM 等人和他一起打牌.由于人数众多,东东稍微修改了亿下游戏规则: 所有扑克牌只按数字来算大小,忽略花色. 每张扑克牌的大小由一个值表示.A, 2, ...

最新文章

  1. 如何用css实现等高布局。
  2. Silverlight 游戏开发小技巧:轨迹跟随效果
  3. pytorch torch.load
  4. Ui学习笔记---EasyUI的EasyLoader组件源码分析
  5. kubernetes的常用命令
  6. 【CCCC】L3-015 球队“食物链” (30分),搜索排列
  7. html 属性存储对象,在HTML5 localStorage中存储对象
  8. 2019118_四个化学数据分析(3)
  9. FFmpeg实现音视频同步的精准片段拼接
  10. 将本地无损音乐上传到Apple Music中使用。
  11. zebradesginer zpl代码_斑马ZebraDesigner免费标签编辑软件
  12. erp系统有什么用?中小企业实施erp软件的好处有哪些
  13. 软件测试技术学习总结
  14. 有什么好玩的网页小游戏网站推荐么?
  15. cin/cou效率太慢?试一下 ios::sync_with_stdio(false);
  16. 裸金属服务器与云服务器的差别是什么?
  17. 前端程序员常用办公工具(持续更新)
  18. html如何让网页全屏,如何把页面弄成全屏?
  19. 中国矿业大学2020岁末赛校赛wp
  20. 深信服上网行为管理开启snmp_SANGFOR上网行为管理系统用户手册.pdf

热门文章

  1. IDEA远程连接虚拟机
  2. 近乎万能的手机Rom刷机攻略~
  3. 数据存储大讲堂:谈磁盘列阵与RAID技巧
  4. 2021-2027全球与中国电子礼品卡市场现状及未来发展趋势
  5. myql 查询树形表结果:说说、说说的评论、评论的回复
  6. 使用chrome调试手机,平板,pc上各种浏览器上的页面
  7. mbp 封神台靶场 一(笔记)
  8. 3DSMAX中英文对比大全(从A-Z分类)
  9. oracle php一键安装,Oracle8.1.6i+ Apache1.3.14+PHP4.0.3完全安装实例
  10. gre 填空31-42