存每種牌的出現次數,然後從大到小找,用多個ans數組存大小。雖然代碼長但是很穩。
WA點:
①10不能算兩個字符,應該拆開考慮
②相同時候,多開個數組記錄。
#include<bits/stdc++.h>
using namespace std;
int a[100010][14];
int sum[100010];
string name[100010],val[100010];
struct p{
string name;
int ans1,ans2,ans3,ans4;
//int sum;
//int a[13];
}p1[100010];
bool cmp(p x,p y){
if(x.ans1!=y.ans1)return x.ans1<y.ans1;
else if(x.ans2!=y.ans2)return x.ans2>y.ans2;
else if(x.ans3!=y.ans3)return x.ans3>y.ans3;
else if(x.ans4!=y.ans4)return x.ans4>y.ans4;
else return x.name<y.name;
}
int maxshun(int k){
if(a[k][1]&&a[k][10]&&a[k][11]&&a[k][12]&&a[k][13])return 1;
else return -1;
}
int shun(int k){
for(int i=13;i>=5;i--){
if(a[k][i]&&a[k][i-1]&&a[k][i-2]&&a[k][i-3]&&a[k][i-4])return i;
}
return -1;
}
int four(int k){
for(int i=13;i>=1;i--){
if(a[k][i]==4)return i;
}
return -1;
}
int ful(int k){
int flag=0;
int flag1=0;
for(int i=13;i>=1;i--){
if(a[k][i]==3)flag=i;
if(a[k][i]==2)flag1=i;
}
if(flag1&&flag)return flag;
return -1;
}
int three(int k){
for(int i=13;i>=1;i--){
if(a[k][i]==3)return i;
}
return -1;
}
int twop(int k){
int flag=0;
int max1=-1;
for(int i=13;i>=1;i--){
if(a[k][i]==2)max1=max(i,max1),flag++;
}
if(flag==2)return max1;
else return -1;
}
int two(int k){
for(int i=13;i>=1;i--){
if(a[k][i]==2)return i;
}
return -1;
}
int sum1(int k){
int len=(val[k].length());
for(int i=0;i<len;i++){
int pos=(int)(val[k][i]-'0');
if(val[k][i]=='J')a[k][11]++,sum[k]+=11;
else if(val[k][i]=='Q')a[k][12]++,sum[k]+=12;
else if(val[k][i]=='K')a[k][13]++,sum[k]+=13;
else if(val[k][i]=='A')a[k][1]++,sum[k]+=1;
else if(i<len-1&&val[k][i]=='1'&&val[k][i+1]=='0')a[k][10]++,sum[k]+=10;
else if(val[k][i-1]=='1'&&val[k][i]=='0')continue;
else a[k][pos]++,sum[k]+=pos;
}
}
int yu(int k,int type1){
if(type1==3){
for(int i=13;i>=1;i--){
if(a[k][i]==1)return i;
}
}
else if(type1==4){
for(int i=13;i>=1;i--){
if(a[k][i]==2)return i;
}
}
else if(type1==5){
int sum=0;
for(int i=13;i>=1;i--){
if(a[k][i]==1)sum+=i;
}
return sum;
}
else if(type1==6){
for(int i=1;i<=13;i++){
if(a[k][i]==2)return i;
}
}
else if(type1==7){
int sum=0;
for(int i=13;i>=1;i--){
if(a[k][i]==1)sum+=i;
}
return sum;
}
else if(type1==8){
return sum[k];
}
}
int yu2(int k){
for(int i=13;i>=1;i--){
if(a[k][i]==1)return i;
}
}
//3
//Alice AAA109
//Bob 678910
//Boa 678910
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>p1[i].name>>val[i];
sum1(i);
if(maxshun(i)!=-1)p1[i].ans1=1;
else if(shun(i)!=-1)p1[i].ans1=2,p1[i].ans2=shun(i);
else if(four(i)!=-1)p1[i].ans1=3,p1[i].ans2=four(i),p1[i].ans3=yu(i,3);
else if(ful(i)!=-1)p1[i].ans1=4,p1[i].ans2=ful(i),p1[i].ans3=yu(i,4);
else if(three(i)!=-1)p1[i].ans1=5,p1[i].ans2=three(i),p1[i].ans3=yu(i,5);
else if(twop(i)!=-1)p1[i].ans1=6,p1[i].ans2=twop(i),p1[i].ans3=yu(i,6),p1[i].ans4=yu2(i);
else if(two(i)!=-1)p1[i].ans1=7,p1[i].ans2=two(i),p1[i].ans3=yu(i,7);
else p1[i].ans1=8,p1[i].ans2=yu(i,8);
}
sort(p1,p1+n,cmp);
for(int i=0;i<n;i++){
cout<<p1[i].name<<endl;
}
}