记录编号 430809 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2015]斗地主 最终得分 100
用户昵称 GravatarAnonymity 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2017-07-30 17:16:47 内存使用 0.00 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cstring>
#define maxn 16
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
inline int read()
{   char c=getchar();int x=0,y=1;
    while(c<'0'||c>'9'){if(c=='-') y=-1;c=getchar();}
    while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
    return x*y;
}
int t,n,ans,num[maxn],cnt,sz[maxn];
inline int st(int x)
{	if(x>=3) return x-2;
	if(x==1) return 12;
	if(x==2) return 13;
	if(x==0) return 14; 
}
int solve()
{	int tmp=0;mem(sz,0);
	for(int i=1;i<=14;i++) sz[num[i]]++;
	while(sz[4]&&sz[2]>=2) tmp++,sz[4]--,sz[2]-=2;
	while(sz[4]&&sz[1]>=2) tmp++,sz[4]--,sz[1]-=2;
	while(sz[3]&&sz[2]>=1) tmp++,sz[3]--,sz[2]--;
	while(sz[3]&&sz[1]>=1) tmp++,sz[3]--,sz[1]--;
	return tmp+sz[1]+sz[2]+sz[3]+sz[4];
}
void dfs()
{	if(cnt>ans) return;
	ans=min(ans,cnt+solve());
	for(int i=1;i<=11;i++)
	{	int j=i;
		while(num[j]>=3&&j<=12) j++;
		if(j-i<2) continue;
		for(int k=j;k-i>=2;k--)
		{	for(int l=i;l<k;l++) num[l]-=3;
			cnt++;dfs();cnt--;
			for(int l=i;l<k;l++) num[l]+=3;
		}
	}
	for(int i=1;i<=10;i++)
	{	int j=i;
		while(num[j]>=2&&j<=12) j++;
		if(j-i<3) continue;
		for(int k=j;k-i>=3;k--)
		{	for(int l=i;l<k;l++) num[l]-=2;
			cnt++;dfs();cnt--;
			for(int l=i;l<k;l++) num[l]+=2;
		}
	}
	for(int i=1;i<=8;i++)
	{	int j=i;
		while(num[j]>=1&&j<=12) j++;
		if(j-i<5) continue;
		for(int k=j;k-i>=5;k--)
		{	for(int l=i;l<k;l++) num[l]-=1;
			cnt++;dfs();cnt--;
			for(int l=i;l<k;l++) num[l]+=1;
		}
	}
}
void init(){mem(num,0);ans=0x7fffffff;cnt=0;}
int Anonymity()
{	freopen("landlords.in","r",stdin);
	freopen("landlords.out","w",stdout);
	t=read();n=read();
	while(t--)
	{	int tmp,tmp2;init();
		for(int i=1;i<=n;i++) tmp=read(),tmp2=read(),num[st(tmp)]++;
		dfs();printf("%d\n",ans);
	}
	return 0;
}
int sakura=Anonymity();
int main(){;}