1.题意
最近,东东沉迷于打牌。所以他找到 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 张牌不同,其值不同。下面依次列举了这手牌的形成规则:
大牌:这手牌不符合下面任一个形成规则。如果 α 和 β 都是大牌,那么定义它们的大小为组成这手牌的 5 张牌的大小总和。
对子:5 张牌中有 2 张牌的值相等。如果 α 和 β 都是对子,比较这个 “对子” 的大小,如果 α 和 β 的 “对子” 大小相等,那么比较剩下 3 张牌的总和。
两对:5 张牌中有两个不同的对子。如果 α 和 β 都是两对,先比较双方较大的那个对子,如果相等,再比较双方较小的那个对子,如果还相等,只能比较 5 张牌中的最后那张牌组不成对子的牌。
三个:5 张牌中有 3 张牌的值相等。如果 α 和 β 都是 “三个”,比较这个 “三个” 的大小,如果 α 和 β 的 “三个” 大小相等,那么比较剩下 2 张牌的总和。
三带二:5 张牌中有 3 张牌的值相等,另外 2 张牌值也相等。如果 α 和 β 都是 “三带二”,先比较它们的 “三个” 的大小,如果相等,再比较 “对子” 的大小。
炸弹:5 张牌中有 4 张牌的值相等。如果 α 和 β 都是 “炸弹”,比较 “炸弹” 的大小,如果相等,比较剩下那张牌的大小。
顺子:5 张牌中形成 x, x+1, x+2, x+3, x+4。如果 α 和 β 都是 “顺子”,直接比较两个顺子的最大值。
龙顺:5 张牌分别为 10、J、Q、K、A。
作为一个称职的魔法师,东东得知了全场人手里 5 张牌的情况。他现在要输出一个排行榜。排行榜按照选手们的 “一手牌” 大小进行排序,如果两个选手的牌相等,那么人名字典序小的排在前面。
不料,此时一束宇宙射线扫过,为了躲避宇宙射线,东东慌乱中清空了他脑中的 Cache。请你告诉东东,全场人的排名
2.样例
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
3.解题思路
- 该题是简化的扑克牌,且可以看出是多关键字排序,首先是排名,其次是对应的比较,最后为字典序,所以采用结构体排序方式
- 由于一直TLE,一开始以为复杂度问题所以写了两个代码,后来发现将cin、cout换为scanf、printf后分别8ms,10ms完成,两个代码的思想都是根据牌的规则决定其排名以及剩余比较参数,第一个代码是用三个数组记录不同数出现的次数,第二个代码直接对牌排序,暴力枚举判断
4.AC代码
- 代码1
#include<stdio.h>
#include<vector>
#include<queue>
#include<string>
#include<algorithm>
#include<map>
#include<cstring>
#include<string.h>
using namespace std;
const int M=1e5+5;
struct player{
string name;
string pi;
int mark;
int cp1;
int cp2;
int cp3;
player(string s1,string s2)
{
name=s1;
pi=s2;
mark=0;
cp1=0;
cp2=0;
cp3=0;
}
bool operator < (const player &pl)const{
if(mark!=pl.mark)
{
return mark>pl.mark;
}
if(cp1!=pl.cp1)
{
return cp1>pl.cp1;
}
if(cp2!=pl.cp2)
{
return cp2>pl.cp2;
}
if(cp3!=pl.cp3)
{
return cp3>pl.cp3;
}
return name<pl.name;
}
};
vector<player>v;
map<char,int>m;
int n;
int a[14];
int b[14];
int c[7];
void clas(string str,int i)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
int ct=0,mark=0,cp1=0,cp2=0,cp3=0;
bool check=false;
for(int i=0;i<str.size();i++)
{
if(str[i]=='A')
{
ct=1;
b[ct]++;
}
else if(str[i]>='2'&&str[i]<='9')
{
ct=str[i]-'0';
b[ct]++;
}
else if(str[i]=='1')
{
ct=10;
b[ct]++;
}
else if(str[i]=='J')
{
ct=11;
b[ct]++;
}
else if(str[i]=='Q')
{
ct=12;
b[ct]++;
}
else if(str[i]=='K')
{
ct=13;
b[ct]++;
}
}
int mx=0,mn=0;
for(int i=0;i<14;i++)
{
if(b[i]!=0)
{
c[b[i]]++;
mx=i;
}
}
for(int i=0;i<14;i++)
{
if(b[i]!=0)
{
mn=i;
break;
}
}
if(b[1]==1&&b[10]==1&&b[11]==1&&b[12]==1&&b[13]==1)
{
mark=8;
check=true;
}
else if(c[1]==5&&mx-mn+1==5)
{
mark=7;
check=true;
}
else if(c[4]==1)
{
mark=6;
check=true;
}
else if(c[2]==1&&c[3]==1)
{
mark=5;
check=true;
}
else if(c[3]==1)
{
mark=4;
check=true;
}
else if(c[2]==2)
{
mark=3;
check=true;
}
else if(c[2]==1)
{
mark=2;
check=true;
}
if(check==false)
{
mark=1;
}
int k1=0,k2=0,k3=0,k4=0,k5=0,k6=0;
if(mark==1)
{
for(int i=0;i<14;i++)
{
if(b[i]!=0)
{
k1+=i;
}
}
cp1=k1;
cp2=0;
cp3=0;
}
else if(mark==2)
{
for(int i=0;i<14;i++)
{
if(b[i]!=0)
{
if(b[i]==2)
{
k1=i;
}
if(b[i]!=2)
{
k2+=i;
}
}
}
cp1=k1;
cp2=k2;
cp3=0;
}
else if(mark==3)
{
for(int i=0;i<14;i++)
{
if(b[i]!=0)
{
if(k1==0&&b[i]==2)
{
k1=i;
}
if(k1!=0&&b[i]==2)
{
k2=i;
}
if(b[i]!=2)
{
k3=i;
}
}
}
cp1=k2;
cp2=k1;
cp3=k3;
}
else if(mark==4)
{
for(int i=0;i<14;i++)
{
if(b[i]!=0)
{
if(b[i]==3)
{
k1=i;
}
if(b[i]!=3)
{
k2+=i;
}
}
}
cp1=k1;
cp2=k2;
cp3=0;
}
else if(mark==5)
{
for(int i=0;i<14;i++)
{
if(b[i]==3)
{
k1=i;
}
if(b[i]==2)
{
k2=i;
}
}
cp1=k1;
cp2=k2;
cp3=0;
}
else if(mark==6)
{
for(int i=0;i<14;i++)
{
if(b[i]==4)
{
k1=i;
}
if(b[i]!=0&&b[i]!=4)
{
k2=i;
}
}
cp1=k1;
cp2=k2;
cp3=0;
}
else if(mark==7)
{
cp1=mx;
cp2=0;
cp3=0;
}
else if(mark==8)
{
cp1=0;
cp2=0;
cp3=0;
}
v[i].mark=mark;
v[i].cp1=cp1;
v[i].cp2=cp2;
v[i].cp3=cp3;
}
int main()
{
char s1[11],s2[11];
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
{
scanf("%s %s",s1,s2);
v.push_back(player(s1,s2));
clas(s2,i);
}
sort(v.begin(),v.end());
for(int i=0;i<v.size();i++)
{
string str=v[i].name;
printf("%s\n",str.c_str());
}
v.clear();
}
return 0;
}
- 代码2
#include<iostream>
#include<vector>
#include<queue>
#include<string>
#include<algorithm>
#include<map>
#include<cstring>
#include<string.h>
using namespace std;
struct player{
string name;
string pi;
int mark;
int cp1;
int cp2;
int cp3;
player(string s1,string s2)
{
name=s1;
pi=s2;
mark=0;
cp1=0;
cp2=0;
cp3=0;
}
bool operator < (const player &pl)const{
if(mark!=pl.mark)
{
return mark>pl.mark;
}
if(cp1!=pl.cp1)
{
return cp1>pl.cp1;
}
if(cp2!=pl.cp2)
{
return cp2>pl.cp2;
}
if(cp3!=pl.cp3)
{
return cp3>pl.cp3;
}
return name<pl.name;
}
};
vector<player>v;
map<char,int>m;
int n;
int a[5];
void ini()
{
m['A']=1;
m['2']=2;
m['3']=3;
m['4']=4;
m['5']=5;
m['6']=6;
m['7']=7;
m['8']=8;
m['9']=9;
m['S']=10;
m['J']=11;
m['Q']=12;
m['K']=13;
}
void clas(string str,int i)
{
memset(a,0,sizeof(a));
int ct=0,mark=0,cp1=0,cp2=0,cp3=0;
for(int i=0;i<str.size();i++)
{
if(i<str.size()-1&&str[i+1]=='0')
{
a[ct]=m['S'];
i++;
ct++;
}
else
{
a[ct]=m[str[i]];
ct++;
}
}
sort(a,a+5);
if(a[0]==1&&a[1]==10&&a[2]==11&&a[3]==12&&a[4]==13)
{
mark=8;
cp1=0;
cp2=0;
cp3=0;
}
else if(a[0]==a[1]-1&&a[1]==a[2]-1&&a[2]==a[3]-1&&a[3]==a[4]-1)
{
mark=7;
cp1=a[4];
cp2=0;
cp3=0;
}
else if(a[0]==a[3]||a[1]==a[4])
{
mark=6;
if(a[0]==a[3])
{
cp1=a[0];
cp2=a[4];
cp3=0;
}
if(a[1]==a[4])
{
cp1=a[4];
cp2=a[0];
cp3=0;
}
}
else if(a[0]==a[2]&&a[3]==a[4])
{
mark=5;
cp1=a[0];
cp2=a[4];
cp3=0;
}
else if(a[0]==a[1]&&a[2]==a[4])
{
mark=5;
cp1=a[4];
cp2=a[0];
cp3=0;
}
else if(a[0]==a[2]||a[1]==a[3]||a[2]==a[4])
{
mark=4;
if(a[0]==a[2])
{
cp1=a[0];
cp2=a[3]+a[4];
cp3=0;
}
else if(a[1]==a[3])
{
cp1=a[1];
cp2=a[0]+a[4];
cp3=0;
}
else if(a[2]==a[4])
{
cp1=a[2];
cp2=a[0]+a[1];
cp3=0;
}
}
else if(a[0]==a[1]&&a[2]==a[3])
{
mark=3;
cp1=a[2];
cp2=a[0];
cp3=a[4];
}
else if(a[0]==a[1]&&a[3]==a[4])
{
mark=3;
cp1=a[3];
cp2=a[0];
cp3=a[2];
}
else if(a[1]==a[2]&&a[3]==a[4])
{
mark=3;
cp1=a[3];
cp2=a[1];
cp3=a[0];
}
else if(a[0]==a[1])
{
mark=2;
cp1=a[0];
cp2=a[2]+a[3]+a[4];
cp3=0;
}
else if(a[1]==a[2])
{
mark=2;
cp1=a[1];
cp2=a[0]+a[3]+a[4];
cp3=0;
}
else if(a[2]==a[3])
{
mark=2;
cp1=a[2];
cp2=a[0]+a[1]+a[4];
cp3=0;
}
else if(a[3]==a[4])
{
mark=2;
cp1=a[3];
cp2=a[0]+a[1]+a[2];
cp3=0;
}
else
{
mark=1;
cp1=a[0]+a[1]+a[2]+a[3]+a[4];
cp2=0;
cp3=0;
}
v[i].mark=mark;
v[i].cp1=cp1;
v[i].cp2=cp2;
v[i].cp3=cp3;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
ini();
//string s1,s2;
char s1[11],s2[11];
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
{
//cin>>s1>>s2;
scanf("%s %s",s1,s2);
v.push_back(player(s1,s2));
//v[i].name=s1;
//v[i].pi=s2;
clas(s2,i);
}
sort(v.begin(),v.end());
for(int i=0;i<v.size();i++)
{
string str=v[i].name;
//cout<<str<<endl;
printf("%s\n",str.c_str());
}
v.clear();
}
return 0;
}