题目链接: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;
}