代码附上
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int num[20],n,t,ans;
void dfs(int cnt)
{
if(cnt>=ans) return;
int k=0;
for(int i=3;i<=14;i++) //单顺
{
if(num[i]==0) k=0;
else
{
k++;
if(k>=5)
{
for(int j=i;j>=i-k+1;j--) num[j]--;
dfs(cnt+1);
for(int j=i;j>=i-k+1;j--) num[j]++;
}
}
}
k=0; //连对
for(int i=3;i<=14;i++)
{
if(num[i]<=1) k=0;
else
{
k++;
if(k>=3)
{
for(int j=i;j>=i-k+1;j--) num[j]-=2;
dfs(cnt+1);
for(int j=i;j>=i-k+1;j--) num[j]+=2;
}
}
}
k=0; //飞机
for(int i=3;i<=14;i++)
{
if(num[i]<=2) k=0;
else
{
k++;
if(k>=2)
{
for(int j=i;j>=i-k+1;j--) num[j]-=3;
dfs(cnt+1);
for(int j=i;j>=i-k+1;j--) num[j]+=3;
}
}
}
for(int i=2;i<=14;i++)
{
if(num[i]<=3) //三张
{
if(num[i]<=2) continue;
num[i]-=3;
for(int j=2;j<=15;j++) //三带一
{
if(num[j]<=0 || j==i) continue;
num[j]--;
dfs(cnt+1);
num[j]++;
}
for(int j=2;j<=14;j++) //三带一对
{
if(num[i]<=1 || i==j) continue;
num[j]-=2;
dfs(cnt+1);
num[j]+=2;
}
num[i]+=3;
}
else //四张
{
num[i]-=3;
for(int j=2;j<=15;j++) //三带一
{
if(num[j]<=0 || j==i) continue;
num[j]--;
dfs(cnt+1);
num[j]++;
}
for(int j=2;j<=14;j++) //三带二
{
if(num[i]<=1 || i==j) continue;
num[j]-=2;
dfs(cnt+1);
num[j]+=2;
}
num[i]+=3;
num[i]-=4; //四个
for(int j=2;j<=15;j++)
{
if(num[j]<=0 || i==j) continue; //带俩单
num[j]--;
for(int k=2;k<=15;k++)
{
if(num[k]<=0 || k==j) continue;
num[k]--;
dfs(cnt+1);
num[k]++;
}
num[j]++;
}
for(int j=2;j<=14;j++) //带俩双
{
if(num[j]<=1 || i==j) continue;
num[j]-=2;
for(int k=2;k<=14;k++)
{
if(num[k]<=1 || k==j) continue;
num[k]-=2;
dfs(cnt+1);
num[k]+=2;
}
num[j]+=2;
}
num[i]+=4;
}
}
for(int i=2;i<=15;i++)
{
if(num[i]) cnt++;
}
ans=min(ans,cnt);
}
int main()
{
scanf("%d%d",&t,&n);
while(t--)
{
ans=1e9+7;
memset(num,0,sizeof(num));
for(int i=1;i<=n;i++)
{
int ma,color;
scanf("%d%d",&ma,&color);
if(ma==0) num[15]++;
else if(ma==1) num[14]++;
else num[ma]++;
}
dfs(0);
printf("%d\n",ans);
}
return 0;
}
/*
1 13
3 4
7 1
4 3
4 2
3 4
12 4
4 1
6 2
12 4
6 2
6 3
13 3
3 4
*/