当前位置:   article > 正文

2019年 蓝桥杯A组部分题解_蓝桥杯2019国赛无方集合

蓝桥杯2019国赛无方集合

试题 I: 糖果
时间限制: 1.0s 内存限制: 256.0MB 本题总分:25 分
【问题描述】
糖果店的老板一共有 M 种口味的糖果出售。为了方便描述,我们将 M 种
口味编号 1 ∼ M。
小明希望能品尝到所有口味的糖果。遗憾的是老板并不单独出售糖果,而
是 K 颗一包整包出售。
幸好糖果包装上注明了其中 K 颗糖果的口味,所以小明可以在买之前就知
道每包内的糖果口味。
给定 N 包糖果,请你计算小明最少买几包,就可以品尝到所有口味的糖
果。
【输入格式】
第一行包含三个整数 N、M 和 K。
接下来 N 行每行 K 这整数 T1, T2, · · · , TK,代表一包糖果的口味。
【输出格式】
一个整数表示答案。如果小明无法品尝所有口味,输出 −1。
【样例输入】
6 5 3
1 1 2
1 2 3
1 1 3
2 3 5
5 4 2
5 1 2
试题I: 糖果 14
第十届蓝桥杯大赛软件类省赛 C/C++ 大学 A 组
【样例输出】
2
【评测用例规模与约定】
对于 30% 的评测用例,1 ≤ N ≤ 20 。
对于所有评测样例,1 ≤ N ≤ 100,1 ≤ M ≤ 20,1 ≤ K ≤ 20,1 ≤ Ti ≤ M。

题解:状压dp,状态转移方程是 dp[j|a[i]]=min(dp[j]+1,dp[j|a[i]])(在状态为j的基础上买第i包后的最小个数)。

code:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<string>
  4. #include<algorithm>
  5. #include<queue>
  6. #include<cmath>
  7. #include<string>
  8. using namespace std;
  9. int n, k, m;
  10. const int N = 1024 * 1024;
  11. int dp[N], a[105];
  12. int main() {
  13. int x;
  14. scanf("%d%d%d", &n, &m, &k);
  15. for (int i = 0; i < n; i++) {
  16. int now = 0;
  17. for (int j = 0; j < k; j++) {
  18. scanf("%d", &x);
  19. x = pow(2, x - 1);
  20. now = now | x;
  21. }
  22. a[i + 1] = now;
  23. }
  24. memset(dp, 0x3f3f3f, sizeof(dp));
  25. dp[0] = 0;
  26. int mx = pow(2, m );
  27. for (int i = 1; i <= n; i++) {
  28. for (int j = 0; j < mx; j++) {
  29. dp[j | a[i]] = min(dp[j] + 1, dp[j | a[i]]);
  30. }
  31. }
  32. cout << dp[mx-1] << endl;
  33. return 0;
  34. }

另一种方法,使用数据结构dlx解决重复覆盖。

code:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<string>
  5. #include<queue>
  6. #include<algorithm>
  7. using namespace std;
  8. #define inf 0x3f3f3f
  9. #define N 105
  10. int n, m, k, cnt;
  11. int ansd;
  12. int mp[N][N];
  13. int S[N], R[N], L[N], U[N], D[N], H[N],Col[N];
  14. void init() {
  15. ansd = inf;
  16. memset(mp, 0, sizeof(mp));
  17. memset(S, 0, sizeof(S));
  18. for (int i = 0; i <= m; i++) {
  19. S[i] = 0;
  20. R[i] = i + 1;L[i] = i - 1;
  21. U[i] = D[i] = i;
  22. }
  23. R[m] = 0; L[0] = m;
  24. for (int i = 0; i <= n; i++)
  25. H[i] = -1;
  26. cnt = m;
  27. }
  28. void line(int r,int c) {
  29. //cout << cnt <<" "<<R[0]<< endl;
  30. cnt++;
  31. Col[cnt] = c;
  32. S[c]++;
  33. D[cnt] = D[c];
  34. U[D[c]] = cnt;
  35. U[cnt] = c;
  36. D[c] = cnt;
  37. if (H[r] < 0)H[r] = R[cnt] = L[cnt] = cnt;
  38. else {
  39. R[cnt] = R[H[r]]; L[R[H[r]]] = cnt;
  40. L[cnt] = H[r]; R[H[r]] = cnt;
  41. }
  42. }
  43. void remove(int c) {
  44. for (int i = D[c]; i != c; i = D[i]) {
  45. L[R[i]] = L[i], R[L[i]] = R[i];
  46. }
  47. }
  48. void resume(int c) {
  49. for (int i = U[c]; i != c; i = U[i])
  50. L[R[i]] = R[L[i]] = i;
  51. }
  52. int f() {
  53. bool vv[N];
  54. int ret = 0, c, i, j;
  55. for (c = R[0]; c != 0; c = R[c])vv[c] = 1;
  56. for(c=R[0];c!=0;c=R[c])
  57. if (vv[c]) {
  58. ++ret, vv[c] = 0;
  59. for (i = D[c]; i != c; i = D[i]) {
  60. for (j = R[i]; j != i; j = R[j])
  61. vv[Col[j]] = 0;
  62. }
  63. }
  64. return ret;
  65. }
  66. void dfs(int d) {
  67. if (d + f() >= ansd)return;
  68. if (R[0] == 0) {
  69. if (d < ansd)ansd = d;
  70. return;
  71. }
  72. int c = R[0];
  73. for (int i = R[0]; i; i = R[i]) {
  74. if (S[i] < S[c]) {
  75. c = i;
  76. }
  77. }
  78. for (int i = D[c]; i != c; i = D[i]) {
  79. remove(i);
  80. for (int j = R[i]; j != i; j = R[j])
  81. remove(j);
  82. dfs(d + 1);
  83. for (int j = L[i]; j != i; j = L[j])
  84. resume(j);
  85. resume(i);
  86. }
  87. }
  88. int main() {
  89. int x;
  90. scanf("%d%d%d", &n, &m, &k);
  91. init();
  92. for (int i = 1; i <= n; i++) {
  93. for (int j = 1; j <= k; j++) {
  94. scanf("%d", &x);
  95. mp[i][x] = 1;
  96. }
  97. }
  98. for (int i = 1; i <= n; i++) {
  99. for (int j = 1; j <= m; j++) {
  100. if (mp[i][j]) {
  101. line(i, j);
  102. }
  103. }
  104. }
  105. dfs(0);
  106. cout << ansd << endl;
  107. while (1);
  108. return 0;
  109. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/302859
推荐阅读
相关标签
  

闽ICP备14008679号