题目链接:https://nanti.jisuanke.com/t/41408
题目大意:
给出两个字符串,分别表示名字和五张扑克牌(不考虑花色)
然后根据规则从大到小进行排序
排序方法从小到大如下:
五张是不连续的牌,同类型按总和从大到小进行排序
两张相同的牌,其余的牌都不相同,同类型先按相同的牌的值从大到小排序,若相同,则按照剩余牌的和从大到小排序
有两组两张相同的牌,先按两组的最大的排序,若相同,则按第二小的从大到小排序,若还相同,按剩余的那一张牌的大小进行排序
有三张牌相同,剩余的两张牌的大小不同,按这三张牌的大小进行排序,若相同,则按剩余的两张牌的和进行排序
有三张牌相同,剩余两张牌的值也相同,先按三张牌的大小进行排序,若相同,则按两张牌的值进行排序
有四张牌值相同,则按照四张牌的只进行排序,然后按剩余的一张牌的进行排序
五张牌的值是连续的,这是第二大的情况
最大的情况是A-10-J-Q-K
题目解析:
这是一道复杂的模拟,题目与ZOJ1111类似,但是因为不考虑花色,所以难度比那道题要小很多
我们可以把它看成是一个结构体排序
每种情形对应一个等级,每个等级按牌的优先级再设多个小等级
输入的时候就将等级处理出来
最后一个结构体排序即可
AC代码:
#include<iostream>
#include<string.h>
#include<map>
#include<algorithm>
using namespace std;
struct node{
int rank;//表示等级
char a[15];//表示姓名
int fi;
int se;
};
bool cmp(node a,node b){
if(a.rank!=b.rank){
return a.rank>b.rank;
}
else if(a.fi!=b.fi){
return a.fi>b.fi;
}
else if(a.se!=b.se){
return a.se>b.se;
}
else{
return strcmp(a.a,b.a)<0;
}
}//排序
node p[100010];
int main() {
int n;
while(cin>>n){
for(int k=1;k<=n;k++){
char b[100];
scanf("%s%s",p[k].a,b);
//printf("%s%s\n",a,b);
int cnt[150];
int cnt1[100];
memset(cnt,0,sizeof(cnt));
memset(cnt1,0,sizeof(cnt1));
p[k].fi=0;
p[k].se=0;
// cout<<strlen(b)<<endl;
// cout<<b[0]<<endl;
for(int i=0;i<strlen(b);i++){
if(b[i]=='A'){
cnt[1]++;
}else if(b[i]=='J'){
cnt[11]++;
}else if(b[i]=='Q'){
cnt[12]++;
}else if(b[i]=='K'){
cnt[13]++;
}else if(b[i]=='1'){
cnt[10]++;
}else{
if(b[i]=='0'){
continue;
}else{
cnt[b[i]-'1'+1]++;
}
}//记录每张牌出现的次数 1~13
}
for(int i=1;i<=13;i++){
cnt1[cnt[i]]++;
}
if(cnt1[2]==1&&cnt1[1]==3){//两个相同,三个不同
p[k].rank=2;
for(int j=1;j<=13;j++){
if(cnt[j]==2){
p[k].fi=max(p[k].fi,j);
}
else if(cnt[j]==1){
p[k].se+=j;
}
}
}
else if(cnt1[2]==2&&cnt1[1]==1){//两个相同
p[k].rank=3;
for(int j=1;j<=13;j++){
if(cnt[j]==2){
if(p[k].fi<j){
p[k].se=p[k].fi;
p[k].fi=j;
}
}
else if(cnt[j]==1){
p[k].se+=j;
}
}
}
else if(cnt1[3]==1&&cnt1[1]==2){//三个相同,两个不同
p[k].rank=4;
for(int j=1;j<=13;j++){
if(cnt[j]==3){
p[k].fi=j;
}else if(cnt[j]==1){
p[k].se+=j;
}
}
}
else if(cnt1[3]==1&&cnt1[2]==1){//三个相同,两个相同
p[k].rank=5;
for(int j=1;j<=13;j++){
if(cnt[j]==3){
p[k].fi=j;
}
else if(cnt[j]==2){
p[k].se=j;
}
}
}
else if(cnt1[4]==1&&cnt1[1]==1||cnt1[5]==1){//四个相同,一个不同 ||五个相同
p[k].rank=6;
for(int j=1;j<=13;j++){
if(cnt[j]==4){
p[k].fi=j;
}
else if(cnt[j]==1){
p[k].se=j;
}
if(cnt[j]==5){
p[k].fi=j;
p[k].se=j;
}
}
}
else if(cnt[10]&&cnt[11]&&cnt[12]&&cnt[13]&&cnt[1]){
p[k].rank=8;
continue;
}
else if(cnt1[1]==5){//五个不同
int f;
int flag=1;
int sum=0;
for(int j=1;j<=13;j++){
int cnt3=0;
if(cnt[j]==1&&flag){
sum+=j;
f=j;
for(int l=j;l<j+5;l++){
if(cnt[l]==1){
cnt3++;
}else{
flag=0;
break;
}
}
if(cnt3==5){
p[k].rank=7;
flag=0;
p[k].fi=f;
}
}else if(cnt[j]==1){
sum+=j;
continue;
}
}
if(!flag){
p[k].fi=sum;
}
// cout<<p[k].fi<<":"<<endl;
}
}
sort(p+1,p+n+1,cmp);
for(int i=1;i<=n;i++){
// cout<<p[i].rank<<endl;
// cout<<"$"<<p[i].fi<<" "<<p[i].se<<endl;
cout<<p[i].a<<endl;
// cout<<"*"<<p[i].rank<<" "<<p[i].fi<<" "<<p[i].se<<endl;
// printf("%s\n",p[i].a);
}
}
}