#include<bits/stdc++.h>
using namespace std;
int t,n,ans;
int s[20];
void dfs(int step)
{
int i,j,p[5];//每张牌最多4张
memset(p,0,sizeof(p));
int flag=0;
for (i=1;i<=14;i++)p[s[i]]++;
if (s[14]==2){
p[2]--;
p[1]+=2;
flag=1;
}
int cnt1=0,cnt2=0;
for (i=1;i<=p[4];i++){//四带
if (p[1]>=2)p[1]-=2;else if (p[2]>=2)p[2]-=2;else if (p[2]>=1)p[2]-=1;else cnt1++;
}
for (i=1;i<=p[3];i++){//三带
if (p[1]>=1)p[1]--;else if (p[2]>=1)p[2]--;else cnt2++;
}
if (flag&&p[1]>=2){
p[1]-=2;p[2]++;
}
if (cnt2>=2&&cnt1>=2){//拆3
int mn=min(cnt1,cnt2);
p[3]-=mn;
cnt1-=mn;
cnt2-=mn;
}
if (cnt1>=1&&cnt2>=2){//拆4
p[4]--;
cnt1--;
cnt2-=2;
}
p[4]-=cnt1/2;//4带自己
p[3]-=cnt2/3;//3带自己
/*for (i=1;i<=4;i++)printf("%d ",p[i]);
puts("");*/
ans=min(ans,step+p[1]+p[2]+p[3]+p[4]);
for (i=1;i<=8;i++)//单顺
{
for (j=i;j<=12;j++)
{
s[j]--;
if (s[j]<0)break;
if (j-i>=4)dfs(step+1);
}
if (j==13)j--;
while (j>=i)s[j--]++;
}
for (i=1;i<=10;i++)//双顺
{
for (j=i;j<=12;j++)
{
s[j]-=2;
if (s[j]<0)break;
if (j-i>=2)dfs(step+1);
}
if (j==13)j--;
while (j>=i)s[j--]+=2;
}
for (i=1;i<=10;i++)//三顺
{
for (j=i;j<=12;j++)
{
s[j]-=3;
if (s[j]<0)break;
if (j-i>=1)dfs(step+1);
}
if (j==13)j--;
while (j>=i)s[j--]+=3;
}
}
//3 4 5 6 7 8 9 10 J Q K A 2 !
//1 2 3 4 5 6 7 8 9 10 11 12 13 14
int main()
{
int i;
scanf("%d%d",&t,&n);
while (t--)
{
memset(s,0,sizeof(s));
ans=1e9;
for (i=1;i<=n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
if (a==0)s[14]++;
else if (a==1||a==2)s[a+11]++;
else if (a>=3)s[a-2]++;
}
dfs(0);
printf("%d\n",ans);
}
return 0;
}
斗弟主增强版,90分,贪心那部分真该不出来了,L姥爷救救我