题目描述
牛牛最近迷上了一种叫斗地主的扑克游戏。斗地主是一种使用黑桃、红心、梅花、方片的A到K加上大小王的共54张牌来进行的扑克牌游戏。在斗地主中,牌的大小关系根据牌的数码表示如下:3<4<5<6<7<8<9<10
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int t,n,ans,a[51],c[51];
int query()
{
int tot=0;
memset(c,0,sizeof(c));
for(int i=0;i<=13;i++)
c[a[i]]++;
while(c[4]&&c[2]>=2)//四带二
c[4]--,c[2]-=2,tot++;
while(c[4]&&c[1]>=2)
c[4]--,c[1]-=2,tot++;
while(c[4]&&c[2])
c[4]--,c[2]--,tot++;
while(c[3]&&c[2])//三带二
c[3]--,c[2]--,tot++;
while(c[3]&&c[1])//三带一
c[3]--,c[1]--,tot++;
return tot+c[1]+c[2]+c[3]+c[4];
}
void dfs(int cnt)
{
if(cnt>=ans)
return ;
if(cnt+query()<ans)
ans=cnt+query();
int x;
for(int i=3;i>=1;i--)//这是顺子
for(int j=2;j<=13;j++)//枚举起点
{
x=j;
while(a[x]>=i)
{
x++;
if((i==3&&x-j>=2)||(i==2&&x-j>=3)||(i==1&&x-j>=5))
{
for(int k=j;k<=x-1;k++)
a[k]-=i;
dfs(cnt+1);
for(int k=j;k<=x-1;k++)
a[k]+=i;
}
}
}
}
int main()
{
scanf("%d%d",&t,&n);
while(t--)
{
ans=1e9;
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if(x==1)
x=13;
else if(x)
x--;
a[x]++;
}
dfs(0);
printf("%d\n",ans);
}
return 0;
}