比赛 20120708 评测结果 AAATTTTTTT
题目名称 硬币收集者 最终得分 30
用户昵称 Makazeu 运行时间 14.392 s
代码语言 C++ 内存使用 0.31 MiB
提交时间 2012-07-08 10:19:55
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
const int MAXN=333;
int coin[MAXN][4],N,res,ans;
map<int,int> hash;
int era[MAXN][2],M=0;

inline int Max(int a,int b) {return a>b?a:b;}

bool dfs2(int deep)
{
	if(deep==M+1)
	{
		map<int,int> :: iterator iter=hash.begin();
		bool flag=0; int tmp=0;
		for(;iter!=hash.end();iter++) 
		{
			if(iter->second==0) {tmp++; continue;}
			if((iter->second)&1) {flag=1;break;}
		}
		if(flag || tmp==hash.size()) return 1; 
		return 0;
	}
	if(dfs2(deep+1)==0) return false;
	
	hash[era[deep][0]]++; hash[era[deep][1]]++; 
	if(dfs2(deep+1)==0) return false;
	hash[era[deep][0]]--; hash[era[deep][1]]--;
	return 1;
}

void dfs1(int deep)
{
	if(deep==N+1) 
	{
		hash.clear();
		bool flag=dfs2(1);
		if(flag) ans=Max(ans,res);
		return;
	}
	dfs1(deep+1);
	M++; era[M][0]=coin[deep][0]; era[M][1]=coin[deep][1]; res+=2; dfs1(deep+1); 
	era[M][0]=coin[deep][2]; era[M][1]=coin[deep][3]; dfs1(deep+1); M--; res-=2;
}


int main()
{
	freopen("coinmn.in","r",stdin);
	freopen("coinmn.out","w",stdout);
	scanf("%d\n",&N);
	while(N!=0)
	{
		ans=0,res=0;
		for(int i=1;i<=N;i++) 
			for(int j=0;j<=3;j++) scanf("%d",&coin[i][j]);
		dfs1(1);
		printf("%d\n",ans);
		scanf("%d\n",&N);
	}
	return 0;
}