这个题好像没什么难度,就是需要耐心调解。
注意事项:1.在加值时,>11要+10,在减值时,>11要-10。
2.判断类型要从分值从大到小判,要先判特殊牌,再判有头牌。
3.在判断是否有头时,也要判断J,K,Q。
4.注意本题是四舍五入。
#include<queue>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int t;
int a[6];
int num[15];
int ans,sum;
bool check()
{
for(int i=1;i<=5;i++)
{
for(int j=i+1;j<=5;j++)
{
for(int k=j+1;k<=5;k++)
{
int b=a[i]>10 ? 10 : a[i];
int c=a[j]>10 ? 10 : a[j];
int d=a[k]>10 ? 10 : a[k];
if((b+c+d)%10==0)
return 1;
}
}
}
return 0;
}
int main()
{
scanf("%d",&t);
while(t--)
{
memset(num,0,sizeof(num));
ans=0,sum=0;
for(int i=1;i<=4;i++)
{
scanf("%d",&a[i]);
num[a[i]]++;
if(a[i]>10) sum+=10;
else sum+=a[i];
}
for(int i=1;i<=13;i++)
{
a[5]=i;
num[i]++;
if(a[5]>10) sum+=10;
else sum+=a[5];
if(sum<=10&&a[1]<5&&a[2]<5&&a[3]<5&&a[4]<5&&a[5]<5)
{
ans+=60;
if(a[5]>10) sum-=10;
else sum-=a[5];
num[i]--;
continue;
}
if(num[11]+num[12]+num[13]==5)
{
ans+=50;
if(a[5]>10) sum-=10;
else sum-=a[5];
num[i]--;
continue;
}
if(num[a[1]]>=4||num[a[2]]>=4||num[a[3]]>=4||num[a[4]]>=4||num[a[5]]>=4)
{
ans+=40;
if(a[5]>10) sum-=10;
else sum-=a[5];
num[i]--;
continue;
}
if(check())
{
if(sum%10==0)
{
ans+=30;
if(a[5]>10) sum-=10;
else sum-=a[5];
num[i]--;
continue;
}
else if(sum%10<7)
{
ans+=sum%10;
if(a[5]>10) sum-=10;
else sum-=a[5];
num[i]--;
continue;
}
else
{
ans+=(sum%10)*2;
if(a[5]>10) sum-=10;
else sum-=a[5];
num[i]--;
continue;
}
}
if(a[5]>10) sum-=10;
else sum-=a[5];
num[i]--;
}
double qw=(double)ans/13.0;
int sw=(int)(qw+0.5);//四舍五入技巧
printf("%d
",sw);
}
return 0;
}