传送门
解:细心的模拟即可。
#include<bits/stdc++.h>
#define il inline
#define pb push_back
#define ms(_data,v) memset(_data,v,sizeof(_data))
#define SZ(a) int((a).size())
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const int N=1e5+5;
//il int Add(ll &x,ll y) {return x=x+y>=mod?x+y-mod:x+y;}
//il int Mul(ll &x,ll y) {return x=x*y>=mod?x*y%mod:x*y;}
unordered_map<char,int> mp;
struct node {
string name;
int type;
int two1,two2,three,four,shun,sum;
void clean(){
name="",type=0,two1=0,two2=0,three=0,four=0,shun=0,sum=0;
}
} a[N];
bool cmp(node x,node y) {
if(x.type!=y.type) return x.type>y.type;
else {
if(x.type==0) {
if(x.sum!=y.sum) return x.sum>y.sum;
else return x.name<y.name;
} else if(x.type==1) {
if(x.two1!=y.two1) return x.two1>y.two1;
else if(x.sum!=y.sum) return x.sum>y.sum;
else return x.name<y.name;
} else if(x.type==2) {
if(x.two2!=y.two2) return x.two2>y.two2;
else if(x.two1!=y.two1) return x.two1>y.two1;
else if(x.sum!=y.sum) return x.sum>y.sum;
else return x.name<y.name;
} else if(x.type==3) {
if(x.three!=y.three) return x.three>y.three;
else if(x.sum!=y.sum) return x.sum>y.sum;
else return x.name<y.name;
} else if(x.type==4) {
if(x.three!=y.three) return x.three>y.three;
else if(x.two1!=y.two1) return x.two1>y.two1;
else if(x.sum!=y.sum) return x.sum>y.sum;
else return x.name<y.name;
} else if(x.type==5) {
if(x.four!=y.four) return x.four>y.four;
else if(x.sum!=y.sum) return x.sum>y.sum;
else return x.name<y.name;
} else if(x.type==6) {
if(x.shun!=y.shun) return x.shun>y.shun;
else return x.name<y.name;
} else return x.name<y.name;
}
}
int n,tt[10],num[15];
int main() {
std::ios::sync_with_stdio(0);cin.tie(0);
mp['A']=1,mp['J']=11,mp['Q']=12,mp['K']=13;
for(char c='1'; c<='9'; ++c) mp[c]=c-'0';
while(cin>>n) {
string na,s;
int cnt=0;
for(int i=1; i<=n; ++i) {
cin>>na>>s;
a[i].name=na;
cnt=0;
for(int j=0,len=SZ(s); j<len; ++j) {
if(j<len-1 && s[j]=='1' && s[j+1]=='0') tt[++cnt]=10,++j;
else tt[++cnt]=mp[s[j]];
}
sort(tt+1,tt+cnt+1);
if(tt[1]==1 && tt[2]==10 && tt[3]==11 && tt[4]==12 && tt[5]==13) a[i].type=7;
else {
int four=0,one=0,two1=0,two2=0,three=0,shun=0,sum=0;
bool fg=0;
ms(num,0);
for(int j=1; j<=cnt; ++j) {
if(!fg && j>1 && tt[j]-tt[j-1]!=1) fg=1;
num[tt[j]]++;
sum+=tt[j];
}
if(!fg) {
a[i].type=6;
a[i].shun=tt[1];
continue;
}
for(int j=1; j<=13; ++j) {
if(num[j]==2) {
if(two1==0) two1=j;
else two2=j;
sum-=j*2;
} else if(num[j]==3) three=j,sum-=3*j;
else if(num[j]==4) four=j,sum-=4*j;
}
if(four!=0) {
a[i].type=5;
a[i].four=four;
a[i].sum=sum;
} else if(three!=0 && two1!=0) {
a[i].type=4;
a[i].three=three,a[i].two1=two1;
} else if(three!=0) {
a[i].type=3;
a[i].three=three,a[i].sum=sum;
} else if(two1!=0 && two2!=0) {
a[i].type=2;
a[i].two1=two1,a[i].two2=two2;
a[i].sum=sum;
} else if(two1!=0) {
a[i].type=1;
a[i].two1=two1;
a[i].sum=sum;
} else {
a[i].type=0;
a[i].sum=sum;
}
}
}
sort(a+1,a+n+1,cmp);
for(int i=1; i<=n; ++i) {
cout<<a[i].name<<endl;
}
for(int i=1;i<=n;++i) a[i].clean();
}
return 0;
}