#include<cstdio>
#include<cstring>
using namespace std;
int n,t,s[15];
int ans,a,b;
int min(int a,int b){return a>b?b:a;}
void dfs(int now){
if(now>ans) return;
int s1,s2,s3,s4;
s1=s2=s3=s4=0;
for(int i=1;i<=14;i++) if(s[i]==1) s1++;//統計單牌和對牌個數;
for(int i=1;i<=14;i++) if(s[i]==2) s2++;
for(int i=1;i<=14;i++) if(s[i]==4){
s4++;
if(s1>=2) s1-=2; //四能多帶儘量多帶;
else if(s2>=2) s2-=2;
else if(s2>=1) s2--;
}
for(int i=1;i<=14;i++)if(s[i]==3){
s3++;
if(s1>=1) s1--; //三帶;
else if(s2>=1) s2--;
}
ans=min(ans,now+s1+s2+s3+s4);
int j;
for(int i=1;i<=8;i++){ //有單順子的情況;
for(j=i;j<=12;j++){
s[j]--;
if(s[j]<0) break;
if(j-i>=4) dfs(now+1);
}
if(j==13) j--; //回溯;
while(j>=i) s[j--]++;
}
for(int i=1;i<=10;i++){ //有雙順子的情況;
for(j=i;j<=12;j++){
s[j]-=2;
if(s[j]<0) break;
if(j-i>=2) dfs(now+1);
}
if(j==13) j--; //回溯;
while(j>=i) s[j--]+=2;
}
for(int i=1;i<=11;i++){ //有三順子的情況;
for(j=i;j<=12;j++){
s[j]-=3;
if(s[j]<0) break;
if(j-i>=1) dfs(now+1);
}
if(j==13) j--; //回溯;
while(j>=i) s[j--]+=3;
}
}
int main(){
scanf("%d%d",&t,&n);
while(t--){
memset(s,0,sizeof(s));
ans=23;
for(int i=1;i<=n;i++){ //將A,2,大王,小王放到最後;
scanf("%d%d",&a,&b);
if(a==0) s[14]++;
if(a==1) s[12]++;
if(a==2) s[13]++;
if(a>=3) s[a-2]++;
}
dfs(0);
printf("%d\n",ans);
}
return 0;
}
去年暴0真是永遠的痛啊。。。沒什麼可說的。。。就是先枚舉所有順子的情況,,,然後再出。據說帶牌要儘量帶單牌。。。表示我打撲克還是太弱了啊。。
。