毒瘤大模拟,披着搜索的皮。。。没错,就是皮。。恶心死了,,,PoPoQQQ大爷说的没错,JB题
//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,num[200],ans=0;
int get(int e[])
{
int gay[50]={0},cnt=0;
for (int i=0;i<14;i++) gay[e[i]]++;
while (gay[4]&&gay[2]>1) gay[4]--,gay[2]-=2,cnt++;
while (gay[4]&&gay[1]>1) gay[4]--,gay[1]-=2,cnt++;
while (gay[4]&&gay[2]>0) gay[4]--,gay[2]--,cnt++;
while (gay[3]&&gay[2]>0) gay[3]--,gay[2]--,cnt++;
while (gay[3]&&gay[1]>0) gay[3]--,gay[1]--,cnt++;
return cnt+gay[1]+gay[2]+gay[3]+gay[4];//最优情况下组合出牌&&单张牌
}
void dfs(int e[],int x)
{
int emm=get(e);
if (!ans||emm+x<ans) ans=x+emm;
if (ans&&x>ans) return ;
int k[200]={0};
for (int i=0;i<14;i++) k[i]=e[i];
for (int i=2;i<14;i++)
{
int j=i;while (e[j]>2) j++;
if (j-i>=2)
{
for (int o=j;o-i>=2;o--)
{
for (int p=i;p<o;p++) k[p]-=3;
dfs(k,x+1);
for (int p=i;p<o;p++) k[p]+=3;
}
}
}//三顺的
for (int i=2;i<14;i++)
{
int j=i;while (e[j]>1) j++;
if (j-i>=3)
{
for (int o=j;o-i>=3;o--)
{
for (int p=i;p<o;p++) k[p]-=2;
dfs(k,x+1);
for (int p=i;p<o;p++) k[p]+=2;
}
}
}//两顺的
for (int i=2;i<14;i++)
{
int j=i;while (e[j]>0) j++;
if (j-i>=5)
{
for (int o=j;o-i>=5;o--)
{
for (int p=i;p<o;p++) k[p]--;
dfs(k,x+1);
for (int p=i;p<o;p++) k[p]++;
}
}
}//单顺
return ;
}
signed main()
{
cin>>n>>m;
while (n--)
{
memset(num,0,sizeof(num));
for (int i=1;i<=m;i++)
{
int a,b;cin>>a>>b;
if (a==1) a=13;
else if (a) a--;
num[a]++;
}
ans=0;dfs(num,0);
cout<<ans<<endl;
}
return 0;
}