题目链接:https://nanti.jisuanke.com/t/41408

判断出牌型再进行评分排序就可以了。

#include <bits/stdc++.h>
#define LL long long
using namespace std;

struct node{
    string s;
    map<int , int> mp;
    int a, b, c, d;
    node(){
        a=0, b=0, c=0, d=0;
    }
}a[1000005];

int id(char s){
    if(s=='A'){
        return 1;
    }
    if(s=='J'){
        return 11;
    }
    if(s=='Q'){
        return 12;
    }
    if(s=='K'){
        return 13;
    }
    return s-'0';
}


void dfs(node &a){
    int s=0;
    for(map<int, int>::iterator p=a.mp.begin(); p!=a.mp.end(); p++){
        s+=p->first;
    }
    a.a=0, a.b=s;

    //cout<<"YES"<<endl;
}

void dfs1(node &a){//对

    int k=0, s=0;
    for(map<int, int>::iterator p=a.mp.begin(); p!=a.mp.end(); p++){
        if(p->second==2){
            k=p->first;
            break;
        }
    }
    if(k==0){
        return ;
    }
    for(map<int, int>::iterator p=a.mp.begin(); p!=a.mp.end(); p++){
        if(p->first!=k){
            s+=(p->first)*(p->second);
        }
    }
    a.a=1, a.b=k, a.c=s, a.d=0;

    //cout<<"对"<<endl;

    return ;
}

void dfs2(node &a){

    int k[5], tot=-1;
    for(map<int, int>::iterator p=a.mp.begin(); p!=a.mp.end(); p++){
        if(p->second==2){
            k[++tot]=p->first;
        }
    }
    if(tot<1){
        return;
    }

    int s=0;
    for(map<int, int>::iterator p=a.mp.begin(); p!=a.mp.end(); p++){
        if(p->first!=k[0]&&p->first!=k[1]){
            s+=(p->first)*(p->second);
        }
    }
    a.a=2, a.b=k[1], a.c=k[0], a.d=s;

    //cout<<"2对2相同"<<a.a<<a.b<<a.c<<a.d<<endl;

}

void dfs3(node &a){

    int k=0;
    for(map<int, int>::iterator p=a.mp.begin(); p!=a.mp.end(); p++){
        if(p->second==3){
            k=p->first;
            break;
        }
    }
    if(k==0){
        return ;
    }

    int s=0;
    for(map<int, int>::iterator p=a.mp.begin(); p!=a.mp.end(); p++){
        if(p->first!=k){
            s+=(p->first)*(p->second);
        }
    }
    a.a=3, a.b=k, a.c=s, a.d=0;

    //cout<<"3种相同"<<endl;
}

void dfs4(node &a){

    int k=0;
    for(map<int, int>::iterator p=a.mp.begin(); p!=a.mp.end(); p++){
        if(p->second==3){
            k=p->first;
            break;
        }
    }

    if(k==0){
        return ;
    }

    if(a.mp.size()!=2){
        return ;
    }

    int s=0;
    for(map<int, int>::iterator p=a.mp.begin(); p!=a.mp.end(); p++){
        if(p->first!=k){
            s=p->first;
        }
    }
    a.a=4, a.b=k, a.c=50+s, a.d=0;

    //cout<<"客满YES"<<endl;

}

void dfs5(node &a){//4

    int k=0;
    for(map<int, int>::iterator p=a.mp.begin(); p!=a.mp.end(); p++){
        if(p->second==4){
            k=p->first;
            break;
        }
    }

    if(k==0){
        return;
    }

    int s=0;
    for(map<int, int>::iterator p=a.mp.begin(); p!=a.mp.end(); p++){
        if(p->first!=k){
            s=p->first;
        }
    }
    a.a=5, a.b=k, a.c=s, a.d=0;

    //cout<<"4张相同"<<endl;

}

void dfs6(node &a){//4

    if(a.mp.size()!=5){
        return;
    }
    int k[10], tot=0;
    for(map<int, int>::iterator p=a.mp.begin(); p!=a.mp.end(); p++){
        k[tot++]=p->first;
    }
    for(int i=1 ;i<5; i++){
        if(k[i]!=k[i-1]+1){
            return;
        }
    }

    a.a=6, a.b=k[0], a.c=0, a.d=0;

    //cout<<"5张连续"<<endl;
}

void dfs7(node &a){//4

    if(a.mp.size()!=5){
        return;
    }
    int k[10], tot=0;
    for(map<int, int>::iterator p=a.mp.begin(); p!=a.mp.end(); p++){
        k[tot++]=p->first;
    }
    if(k[0]==1&&k[1]==10&&k[2]==11&&k[3]==12&&k[4]==13){
        a.a=7;
    }
    else{
        return ;
    }
    //cout<<"皇家直道"<<endl;

    return ;


}

int cmp(node a, node b){
    if(a.a==b.a){
        if(a.b==b.b){
            if(a.c==b.c){
                if(a.d==b.d){
                    return a.s<b.s;
                }
                else{
                    return a.d>b.d;
                }
            }
            else{
                return a.c>b.c;
            }
        }
        else{
            return a.b>b.b;
        }
    }
    else{
        return a.a>b.a;
    }
}


int main() {

    int n;
    while(~scanf("%d", &n)){

        for(int i=1; i<=n; i++){
            a[i].a=a[i].b=a[i].c=a[i].d=0;
            a[i].mp.clear();
            char f[20];
            cin>>a[i].s;
            scanf("%s", f);
            for(int j=0; j<strlen(f); j++){
                if(f[j]=='1'&&j+1<strlen(f)&&f[j+1]=='0'){

                    a[i].mp[10]++;
                    j++;
                }
                else{
                    int k=id(f[j]);
                    a[i].mp[k]++;
                }

            }
        }
        for(int i=1; i<=n; i++){
            dfs(a[i]);
            dfs1(a[i]);
            dfs2(a[i]);
            dfs3(a[i]);
            dfs4(a[i]);
            dfs5(a[i]);
            dfs6(a[i]);
            dfs7(a[i]);
        }
        sort(a+1, a+n+1, cmp);

        for(int i=1; i<=n; i++){
            cout<<a[i].s<<endl;
        }
    }

    return 0;
}