题意:太长自己看()

题解:纯粹的大模拟。我们可以对于双反的手牌用分数来赋值,然后进行判断。

这种题通常不涉及多少算法,但一般比较难写,而且存在许多细节需要注意。

AcCode:

#include<bits/stdc++.h>
using namespace std;
int value(string s){
	int cnt[15],val[15],a[5],sum=0,total=0;
	memset(cnt,0,sizeof(cnt));
	for(int i=0;i<=4;i++){
		if(s[i]=='A') {cnt[1]++;a[i]=1;}
		if(s[i]=='2') {cnt[2]++;a[i]=2;}
		if(s[i]=='3') {cnt[3]++;a[i]=3;}
		if(s[i]=='4') {cnt[4]++;a[i]=4;}
		if(s[i]=='5') {cnt[5]++;a[i]=5;}
		if(s[i]=='6') {cnt[6]++;a[i]=6;}
		if(s[i]=='7') {cnt[7]++;a[i]=7;}
		if(s[i]=='8') {cnt[8]++;a[i]=8;}
		if(s[i]=='9') {cnt[9]++;a[i]=9;}
		if(s[i]=='T') {cnt[10]++;a[i]=10;}
		if(s[i]=='J') {cnt[11]++;a[i]=10;}
		if(s[i]=='Q') {cnt[12]++;a[i]=10;}
		if(s[i]=='K') {cnt[13]++;a[i]=10;}
	}
	for(int i=1;i<=13;i++) if(cnt[i]==4) return 150; 
	for(int i=0;i<=4;i++) sum=sum+a[i]; 
	if(sum<=10)  return 140; sum=0;
	for(int i=11;i<=13;i++) total+=cnt[i];
	if(total==5) return 130; total=0;
	for(int i=10;i<=13;i++) total+=cnt[i];
	if(total==5) return 120; 
	for(int i=0;i<=4;i++) sum+=a[i];
	for(int i=0;i<=4;i++) {
		for(int j=i+1;j<=4;j++){
			for(int k=j+1;k<=4;k++){
				if((a[i]+a[j]+a[k])%10==0){
					if(sum%10==0) return 110;
					else return sum%10+100;
				}
			}
		}
	}
	for(int i=13;i>=1;i--) if(cnt[i]!=0) return i;
    return 0;
}
int main(){
	int t;
	string s1,s2;
	cin>>t;
	for(int i=1;i<=t;i++){
		cin>>s1>>s2;
		if(value(s1)>value(s2)) cout<<"HGZnb!!!"<<endl; 
		if(value(s1)==value(s2)) cout<<"So boring"<<endl; 
		if(value(s1)<value(s2)) cout<<"What a dish"<<endl; 
	}
	return 0;
}