最近,阿夸迷于德州扑克。所以她找到了很多人和她一起玩。由于人数众多,阿夸必须更改游戏规则:
所有扑克牌均只看数字,不计花色。
每张卡的值为1、2、3、4、5、6、7、8、9、10、11、12、13 中的一种(对应A,2、3、4、5、6、7, 8、9、10,J,Q,K)
每位玩家从一副完整的扑克牌(没有大小王)中抽出五张扑克牌,可能出现的手牌的值从低到高排列如下:
高牌:不包含以下牌的牌。对于都是高牌的牌,按照五张牌的值的和进行从大到小排序。
对子:手中的5张牌中有2张相同值的牌。对于都拥有对子的牌,按构成该对子的牌的值进行从大到小地排序。如果这些都相同,则按手牌中余下3张牌的值的和进行从大到小排序。**
两对:手中拥有两对不同的对子。对于都包含两对的手牌,按其最高对子的值进行从大到小排序。如果最高对子相同,则按另一个对子的值从大到小地进行排序。如果这些值相同,则按剩余牌的值从大到小地进行排序。
三条:手中拥有3张相同值的牌。对于都包含三条的手牌按构成三条的牌的值进行从大到小地排序。如果这些值相同,则按剩余牌的值从大到小地进行排序。
满堂红:手中拥有一个三条和一个对子。同理,先按三条大小排序,如果三条大小相同,则按对子大小进行排序。
四条:手中拥有4张相同值的牌。对于都包含四条的手牌按构成四条的牌的值进行从大到小地排序。如果这些值相同,则按剩余牌的值从大到小地进行排序。
顺子:手中拥有5张连续值的卡。对于都包含顺子的手牌按顺子最大的牌进行排序。
皇家同花顺:手中拥有10到A(10、J、Q、K、A)。是最大的手牌!**
现在,阿夸已经知道了每个人的手牌,她想要知道所有人的排名列表。如果玩家的手牌大小相等,则按玩家名字的字典序输出。保证没有重复的名字。你能帮帮她吗?
输入格式:
第一行包含一个正整数 N (1<=N<=100000) ,表示玩家的人数。
接下来 N 行,每行包含两个字符串:m (1<=|m|<=10 ) ,表示玩家的名字;s (1<=|s|<=10),表示玩家的手牌。
输出格式:
输出 N个玩家的排名列表。
输入样例:
3
Alice AAA109
Bob 678910
Boa 678910
输出样例:
Boa
Bob
Alice
代码:
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
const char book[14]="A234567891JQK";
map<char,int>mp;
struct node{
string name,book;
char num[5];
int type;
};
bool cmp1(char e,char d){
return mp[e]<mp[d];
}
char tong(char num[],int n){//有n张相同的牌
char c;
int max=0;
map<char,int>mp1;
for(int i=0;i<5;i++){
mp1[num[i]]++;
if(mp1[num[i]]>max){
max=mp1[num[i]];
c=num[i];
}
if(max==n) return c;
}
return 0;
}
bool shun(char num[]){//判断顺子
for(int i=1;i<5;i++){
if(mp[num[i]]!=(mp[num[i-1]]+1)) return false;
}
return true;
}
bool royal(char num[]){//判断皇家同花顺
string r="A1JQK";
string s(num,num+5);//不能直接=num,num有6位
if(s==r) return true;
return false;
}
//
int f(char num[]){
if(royal(num)) return 8;//皇家同花顺
if(shun(num)) return 7;//顺子
if(tong(num,4)) return 6;//四条
if(tong(num,3)){
char c=tong(num,3);
char t='?';
for(int i=0;i<5;i++){
if(num[i]!=c){
if(num[i]==t) return 5;//满堂红
t=num[i];
}
}
return 4;//三条
}
if(tong(num,2)){
int s=0;
for(int i=1;i<5;i++){
if(num[i]==num[i-1])
s++;
}
if(s==2) return 3;//两对
return 2;//对子
}
return 1;//高牌
}
//
bool cmp(node a,node b){
if(a.book!=b.book){
int na=a.type,nb=b.type;
//cout<<na<<nb<<endl;//
if(na==nb){
if(na==8) return a.name<b.name;
if(na==7){
if(a.num[4]!=b.num[4]) return mp[a.num[4]]>mp[b.num[4]];
return a.name<b.name;
}
if(na==6){//TL警告
char sa,sb,da,db;
da=sa=tong(a.num,4);db=sb=tong(b.num,4);
if(sa!=sb) return mp[sa]>mp[sb];
else{
for(int i=0;i<5;i++) if(a.num[i]!=sa) da=a.num[i];
for(int i=0;i<5;i++) if(b.num[i]!=sb) db=b.num[i];
if(da!=db) return mp[da]>mp[db];
}
return a.name<b.name;
}
if(na==5){
char sa,sb,da,db;
sa=tong(a.num,3);sb=tong(b.num,3);
if(sa!=sb) return mp[sa]>mp[sb];
else{
for(int i=0;i<5;i++) if(a.num[i]!=sa) da=a.num[i];
for(int i=0;i<5;i++) if(b.num[i]!=sb) db=b.num[i];
if(da!=db) return mp[da]>mp[db];
}
return a.name<b.name;
}
if(na==4){
char sa,sb;
int da=0,db=0;
sa=tong(a.num,3);sb=tong(b.num,3);
if(sa!=sb) return mp[sa]>mp[sb];
else{
for(int i=0;i<5;i++) if(a.num[i]!=sa) da+=mp[a.num[i]];
for(int i=0;i<5;i++) if(b.num[i]!=sb) db+=mp[b.num[i]];
if(da!=db) return da>db;
}
return a.name<b.name;
}
if(na==3){
char a1,a2,b1,b2,da,db;
if(a.num[4]!=a.num[3]){
a1=a.num[3];a2=a.num[0];da=a.num[4];
}else{
a1=a.num[4];
if(a.num[0]==a.num[1]){
a2=a.num[0];da=a.num[2];
}else{
a2=a.num[1];da=a.num[0];
}
}
if(b.num[4]!=b.num[3]){
b1=b.num[3];b2=b.num[0];db=b.num[4];
}else{
b1=b.num[4];
if(b.num[0]==b.num[1]){
b2=b.num[0];db=b.num[2];
}else{
b2=b.num[1];db=b.num[0];
}
}
if(a1!=b1) return mp[a1]>mp[b1];
if(a2!=b2) return mp[a2]>mp[b2];
if(da!=db) return mp[da]>mp[db];
return a.name<b.name;
}
if(na==2){
char sa=tong(a.num,2),sb=tong(b.num,2);
int ssa=0,ssb=0;
if(sa!=sb) return mp[sa]>mp[sb];
for(int i=0;i<5;i++){
if(sa!=a.num[i]){
ssa+=mp[a.num[i]];
}
if(sb!=b.num[i]){
ssb+=mp[b.num[i]];
}
}
if(ssa!=ssb) return ssa>ssb;
return a.name<b.name;
}
if(na==1){
int sa=0,sb=0;
for(int i=0;i<5;i++){
sa+=mp[a.num[i]];sb+=mp[b.num[i]];
}
if(sa!=sb) return sa>sb;
return a.name<b.name;
}
}
return na>nb;
}
return a.name<b.name;
}
//
int main(){
mp['A']=1;mp['2']=2;mp['3']=3;mp['4']=4;mp['5']=5;mp['6']=6;mp['7']=7;mp['8']=8;mp['9']=9;mp['1']=10;mp['J']=11;mp['Q']=12;mp['K']=13;
int n;cin>>n;
node a[n];
for(int i=0;i<n;i++){
cin>>a[i].name>>a[i].book;
int k=0;
for(int j=0;j<a[i].book.size();j++){
if(a[i].book[j]!='0') a[i].num[k++]=a[i].book[j];
}
sort(a[i].num,a[i].num+5,cmp1);
a[i].type=f(a[i].num);
}
sort(a,a+n,cmp);
for(int i=0;i<n;i++){
cout<<a[i].name<<endl;
}
}