比赛 |
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;
}