#include<iostream>
#include<cstring>
using namespace std;
int T,n,sum[20],Min;
void dfs(int t)
{
if(t>=Min)return;
int k=0;
for(int i=3;i<=14;i++)//单顺子
{
if(sum[i]==0)k=0;
else
{
k++;
if(k>=5)
{
for(int j=i;j>=i-k+1;j--)sum[j]--;
dfs(t+1);
for(int j=i;j>=i-k+1;j--)sum[j]++;
}
}
}
k=0;
for(int i=3;i<=14;i++)//双顺子
{
if(sum[i]<=1)k=0;
else
{
k++;
if(k>=3)
{
for(int j=i;j>=i-k+1;j--)sum[j]-=2;
dfs(t+1);
for(int j=i;j>=i-k+1;j--)sum[j]+=2;
}
}
}
k=0;
for(int i=3;i<=14;i++)//三顺子
{
if(sum[i]<=2)k=0;
else
{
k++;
if(k>=2)
{
for(int j=i;j>=i-k+1;j--)sum[j]-=3;
dfs(t+1);
for(int j=i;j>=i-k+1;j--)sum[j]+=3;
}
}
}
for(int i=2;i<=14;i++)//带牌
{
if(sum[i]==3)//三带一
{
sum[i]-=3;
for(int j=2;j<=15;j++)//带一张
{
if(sum[j]==0||i==j)continue;
sum[j]--;
dfs(t+1);
sum[j]++;
}
for(int j=2;j<=14;j++)//带一对
{
if(sum[j]<=1||i==j)continue;
sum[j]-=2;
dfs(t+1);
sum[j]+=2;
}
sum[i]+=3;
}
else if(sum[i]==4)
{
sum[i]-=3;//三带一
for(int j=2;j<=15;j++)//带一张
{
if(sum[j]==0||i==j)continue;
sum[j]--;
dfs(t+1);
sum[j]++;
}
for(int j=2;j<=14;j++)//带一对
{
if(sum[j]<=1||i==j)continue;
sum[j]-=2;
dfs(t+1);
sum[j]+=2;
}
sum[i]+=3;
sum[i]-=4;//四带二
for(int j=2;j<=15;j++)//带二张
{
if(sum[j]==0||i==j)continue;
sum[j]--;
for(int k=2;k<=15;k++)
{
if(sum[k]==0||j==k||i==k)continue;
sum[k]--;
dfs(t+1);
sum[k]++;
}
sum[j]++;
}
for(int j=2;j<=14;j++)//带二对
{
if(sum[j]<=1||i==j)continue;
sum[j]-=2;
for(int k=2;k<=14;k++)
{
if(sum[k]<=1||j==k||i==k)continue;
sum[k]-=2;
dfs(t+1);
sum[k]+=2;
}
sum[j]+=2;
}
sum[i]+=4;
}
}
for(int i=2;i<=15;i++)if(sum[i])t++;//出剩下的牌
Min=min(Min,t);
return;
}
int main()
{
// freopen("p2668.in","r",stdin);
// freopen("p2668.out","w",stdout);
scanf("%d%d",&T,&n);
while(T--)
{
Min=0x3f3f3f3f;
memset(sum,0,sizeof(sum));
for(int i=1;i<=n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
if(a==0)
{
sum[15]++;
}
else if(a==1)
{
sum[14]++;
}
else
{
sum[a]++;
}
}
dfs(0);
printf("%d\n",Min);
}
return 0;
}
@yinbe 是我的大号,我拿大号的提交记录