比赛 20120708 评测结果 WWWTTTTTTT
题目名称 硬币收集者 最终得分 0
用户昵称 CC 运行时间 14.250 s
代码语言 C++ 内存使用 0.31 MiB
提交时间 2012-07-08 11:30:42
显示代码纯文本
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <map>
  5. using namespace std;
  6. map <int,int> t;
  7. int n,m,ans;
  8. int a[300][4],c[300][2];
  9. bool use[300];
  10. bool check() {
  11. if (t.size() == 0) return 1;
  12. for (typeof(t.begin()) i = t.begin();i != t.end();i++)
  13. if ((i ->second) && (i->second % 2)) return 1;
  14. return 0;
  15. }
  16.  
  17. bool pan(int u) {
  18. if (u > m) {
  19. if (!check()) return 0;
  20. return 1;
  21. }
  22. use[u] = 0;
  23. if (!pan(u + 1)) return 0;
  24. use[u] = 1;
  25. t[c[u][0]]++;t[c[u][1]]++;
  26. if (!pan(u + 1)) return 0;
  27. t[c[u][0]]--;t[c[u][1]]--;
  28. return 1;
  29. }
  30. bool dfs(int u) {
  31. if (u > n) {
  32. t.clear();
  33. if (pan(1)) {
  34. ans = std::max(ans,m);
  35. return 1;
  36. }
  37. return 0;
  38. }
  39. if (!dfs(u + 1)) return 0;
  40. c[++m][0] = a[u][0];c[m][1] = a[u][1];
  41. dfs(u + 1);
  42. c[m][0] = a[u][2];c[m][1] = a[u][3];
  43. dfs(u + 1);
  44. m--;
  45. return 1;
  46. }
  47. int main() {
  48. freopen("coinmn.in","r",stdin);
  49. freopen("coinmn.out","w",stdout);
  50. scanf("%d", &n);
  51. while (n) {
  52. for (int i = 1;i <= n;i++)
  53. for (int j = 0;j < 4;j++) scanf("%d", &a[i][j]);
  54. dfs(1);
  55. printf("%d\n", ans * 2);
  56. scanf("%d", &n);
  57. }
  58. return 0;
  59. }