记录编号 279179 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2015]斗地主 最终得分 100
用户昵称 Gravatar521 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2016-07-08 20:57:11 内存使用 0.00 MiB
显示代码纯文本
#include<stdio.h>
#include<string.h>
#define Min(a,b) (a)<(b)?(a):(b)
#define D 14
inline void read(int &x)
{
	char ch;
	while(ch=getchar(),ch<'0'||ch>'9');
	x=ch-'0';
	while(ch=getchar(),ch>47&&ch<58)x=(x<<3)+(x<<1)+ch-'0';
}
int a[20]={0},b[5]={0},ans=0;
inline int search(int x[])
{
	memset(b,0,sizeof(b));
	int i,s=0;
	for(i=3;i<D+3;i++) b[x[i]]++;
	while(b[4]&&b[2]>=2) s++,b[4]--,b[2]-=2;
	while(b[4]&&b[1]>=2) s++,b[4]--,b[1]-=2;
	while(b[3]&&b[2]>=1) s++,b[3]--,b[2]--;
	while(b[3]&&b[1]>=1) s++,b[3]--,b[1]--;
	return s+b[1]+b[2]+b[3]+b[4];
}
inline void dfs(int deep,int rest[])
{
	if(deep>ans) return;
	ans=Min(ans,deep+search(rest));
	int i,j,k,l;
	for(i=3;i<=D-1;i++){
		for(j=i;rest[j]>=3&&j<=D;j++);
		if(j-i>=2){
			for(k=j;k-i>=2;k--){
				for(l=i;l<k;l++) rest[l]-=3;
				dfs(deep+1,rest);
				for(l=i;l<k;l++) rest[l]+=3;
			}
		}
	}
	for(i=3;i<=D-2;i++){
		for(j=i;rest[j]>=2&&j<=D;j++);
		if(j-i>=3){
			for(k=j;k-i>=3;k--){
				for(l=i;l<k;l++) rest[l]-=2;
				dfs(deep+1,rest);
				for(l=i;l<k;l++) rest[l]+=2;
			}
		}
	}
	for(i=3;i<=D-4;i++){
		for(j=i;rest[j]>=1&&j<=D;j++);
		if(j-i>=5){
			for(k=j;k-i>=5;k--){
				for(l=i;l<k;l++) rest[l]-=1;
				dfs(deep+1,rest);
				for(l=i;l<k;l++) rest[l]+=1;
			}
		}
	}
}
int _521()
{
	freopen("landlords.in","r",stdin);
	freopen("landlords.out","w",stdout);
	int T,n;
	read(T),read(n);
	while(T--){
		memset(a,0,sizeof(a));
		for(int i=1,j,k;i<=n;i++){
			read(j);read(k);
			if(j==0) j=16;
			else if(j<3) j+=13;
			a[j]++;
		}
		ans=search(a);
		dfs(0,a);
		printf("%d\n",ans);
	}
	return 0;
}
int _520=_521();
int main(){;}