记录编号 321401 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2015]斗地主 最终得分 100
用户昵称 Gravatar哒哒哒哒哒! 是否通过 通过
代码语言 C++ 运行时间 0.008 s
提交时间 2016-10-13 18:47:43 内存使用 0.30 MiB
显示代码纯文本
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>

using namespace std;

int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')x=x*10+ch-48,ch=getchar();
	return x*f;
}
int n,card[20],b[5],ans;

int search(int a[]){
	memset(b,0,sizeof(b));
	for(int i=3;i<=16;i++) b[a[i]]++;
	int s=0;
	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];
}

void dfs(int cnt,int a[]){
	if(cnt>ans) return;
	ans=min(ans,cnt+search(a));
	for(int i=3,j;i<=13;i++){
		for(j=i;a[j]>=3&&j<=14;j++);
		if(j-i<2)continue;
		for(int k=j;k-i>=2;k--){
			for(int l=i;l<k;l++)a[l]-=3;
			dfs(cnt+1,a);
			for(int l=i;l<k;l++)a[l]+=3;
		}		
	}
	for(int i=3,j;i<=12;i++){
		for(j=i;a[j]>=2&&j<=14;j++);
		if(j-i<3)continue;
		for(int k=j;k-i>=3;k--){
			for(int l=i;l<k;l++)a[l]-=2;
			dfs(cnt+1,a);
			for(int l=i;l<k;l++)a[l]+=2;
		}	
	}
	for(int i=3,j;i<=10;i++){
		for(j=i;a[j]>=1&&j<=14;j++);
		if(j-i<5)continue;
		for(int k=j;k-i>=5;k--){
			for(int l=i;l<k;l++)a[l]--;
			dfs(cnt+1,a);
			for(int l=i;l<k;l++)a[l]++;
		}		
	}
}

int main(){
	freopen("landlords.in","r",stdin);freopen("landlords.out","w",stdout);
	int t=read();n=read();
	while(t--){
		memset(card,0,sizeof card);
		for(int i=1;i<=n;i++){
			int x=read(),y=read();
			if(x==0) x=16;
			else if(x<3) x+=13;
			card[x]++;
		}
		ans=search(card);dfs(0,card);
		printf("%d\n",ans);
	}
	getchar();getchar();
	fclose(stdin);fclose(stdout);
	return 0;
}