Codeforces 442A - Borya and Hanabi

来源:互联网 发布:手机怎么设置淘宝满减 编辑:程序博客网 时间:2024/06/18 01:12

题意

小明有25种牌,每张有花色和数值,现在他知道手里有哪些牌,但是不知道哪个是哪个。 
旁边的人可以提示他花色,把某个花色的牌告诉他,或者数值,同理。

求最少提示次数。

思路

因为不用管提示的顺序,可以压缩一下再暴力。

考虑不合法的情况:

  1. 有某个属性被提示了两次。说明有两张牌没有被完全提示,这样这两张牌就分不清了。

  2. 有多余一张的牌一个属性也没被提示到。 
    如果只有一张牌没有被提示到,其他的全部知道了,这张牌就可以确定。但是有两张牌就确定不了了。

代码

  1. #include <bits/stdc++.h>
  2. #define LL long long
  3. #define lowbit(x) ((x) & (-x))
  4. const int MAXN = 5000 + 5;
  5. const int INF = 0x3f3f3f3f;
  6. using namespace std;
  7. int sel[10], mp[10][10];
  8. int Change(char *s)
  9. {
  10. if (s[0] == 'R') return 5;
  11. if (s[0] == 'G') return 6;
  12. if (s[0] == 'B') return 7;
  13. if (s[0] == 'Y') return 8;
  14. if (s[0] == 'W') return 9;
  15. }
  16. int main()
  17. {
  18. //freopen("input.txt", "r", stdin);
  19. int n, i, j;
  20. scanf("%d", &n);
  21. for (i = 0; i < n; i++)
  22. {
  23. char s[10];
  24. scanf("%s", s);
  25. int x = Change(s);
  26. mp[x][s[1] - '1'] = 1;
  27. }
  28. int ans = 100;
  29. for (int stat = 0; stat < (1 << 10); stat++)
  30. {
  31. memset(sel, 0, sizeof sel);
  32. bool flag = true;
  33. int temp = 0, emp = 0, modi = 0;
  34. for (i = 0; i < 10; i++)
  35. if (stat & (1 << i)) temp++;
  36. if (temp >= ans)
  37. continue;
  38. for (i = 0; i < 5; i++)
  39. for (j = 5; j < 10; j++)
  40. {
  41. if (mp[j][i])
  42. {
  43. if (stat & (1 << i) && stat & (1 << j))
  44. continue;
  45. else if (stat & (1 << i))
  46. {
  47. sel[i]++;
  48. if (sel[i] > 1) flag = false;
  49. }
  50. else if (stat & (1 << j))
  51. {
  52. sel[j]++;
  53. if (sel[j] > 1) flag = false;
  54. }
  55. else
  56. {
  57. emp++;
  58. if (emp > 1) flag = false;
  59. }
  60. modi = 1;
  61. }
  62. }
  63. if (flag && modi) ans = min(ans, temp);
  64. }
  65. printf("%d\n", ans);
  66. return 0;
  67. }
0 0