[关闭]
@guxier 2022-03-24T07:54:25.000000Z 字数 2626 阅读 818

洛谷-P2392 kkksc03考前临时抱佛脚

洛谷 搜索


原题链接

题目背景

kkksc03 的大学生活非常的颓废,平时根本不学习。但是,临近期末考试,他必须要开始抱佛脚,以求不挂科。

题目描述

这次期末考试,kkksc03 需要考4科。因此要开始刷习题集,每科都有一个习题集,分别有 道题目,完成每道题目需要一些时间,可能不等

kkksc03 有一个能力,他的左右两个大脑可以同时计算2道不同的题目,但是仅限于同一科。因此,kkksc03 必须一科一科的复习。

由于 kkksc03 还急着去处理洛谷的 bug,因此他希望尽快把事情做完,所以他希望知道能够完成复习的最短时间。

输入格式

本题包含 5 行数据:第1行,为四个正整数

第 2 行,为 个数,表示第一科习题集每道题目所消耗的时间。

第 3 行,为 ​​ 共 个数。

第 4 行,为 ​​ 共 ​ 个数。

第 5 行,为 ​​ 共 ​ 个数,意思均同上。

输出格式

输出一行,为复习完毕最短时间。
输入输出样例

输入 #1

  1. 1 2 1 3
  2. 5
  3. 4 3
  4. 6
  5. 2 4 3

输出 #1

  1. 20

说明/提示


题解

算法1

(暴搜)

数据量是20所以直接暴力枚举,也不会超时

用时 81ms 结果

C++代码

  1. #include <cstdio>
  2. #include <vector>
  3. #include <queue>
  4. #include <cstring>
  5. #include <map>
  6. #include <set>
  7. #include <cmath>
  8. #include <iostream>
  9. #include <algorithm>
  10. #define ios ios::sync_with_stdio(false), cin.tie(0)
  11. #define sd(n) scanf("%d", &n)
  12. #define rep(i, a, n) for (int i = a; i <= n; i++)
  13. #define per(i, a, n) for (int i = n; i >= a; i--)
  14. #define fs first
  15. #define se second
  16. #define debug(x) cout << #x << ": " << x << endl
  17. #define MOD 1000000007
  18. #define INF 0x3f3f3f3f
  19. typedef long long ll;
  20. using namespace std;
  21. const int N = 1e4 + 10;
  22. int s[5], a[21], sum, ans, l ,r;
  23. void search(int i,int x)
  24. {
  25. if(i > x)
  26. {
  27. sum = min(sum, max(l,r));
  28. return;
  29. }
  30. //回溯
  31. l += a[i];
  32. search(i+1,x);
  33. l -= a[i];
  34. r += a[i];
  35. search(i+1,x);
  36. r -= a[i];
  37. }
  38. int main()
  39. {
  40. rep(i, 1, 4) cin >> s[i];
  41. rep(i, 1, 4)
  42. {
  43. l = r = 0;
  44. sum = INF;
  45. rep(j, 1, s[i])
  46. cin >> a[j];
  47. search(1, s[i]);
  48. ans += sum;
  49. }
  50. cout << ans;
  51. return 0;
  52. }

算法2

(DP)

时间是体积,也是价值,对于每一门课有n个物品,体积为sum/2(sum为时间总和)的01背包即可。

用时 30ms 结果

C++代码

  1. #include <cstdio>
  2. #include <vector>
  3. #include <queue>
  4. #include <cstring>
  5. #include <map>
  6. #include <set>
  7. #include <cmath>
  8. #include <iostream>
  9. #include <algorithm>
  10. #define ios ios::sync_with_stdio(false), cin.tie(0)
  11. #define sd(n) scanf("%d", &n)
  12. #define rep(i, a, n) for (int i = a; i <= n; i++)
  13. #define per(i, a, n) for (int i = n; i >= a; i--)
  14. #define fs first
  15. #define se second
  16. #define debug(x) cout << #x << ": " << x << endl
  17. #define MOD 1000000007
  18. #define INF 0x3f3f3f3f
  19. typedef long long ll;
  20. using namespace std;
  21. const int N = 1e4 + 10;
  22. int s[5], sum, a[21], ans;
  23. int dp[N];
  24. int main()
  25. {
  26. rep(i, 1, 4) cin >> s[i];
  27. rep(i, 1, 4)
  28. {
  29. sum = 0; //时间总和
  30. memset(dp, 0, sizeof dp);
  31. rep(j, 1, s[i])
  32. {
  33. cin >> a[j];
  34. sum += a[j];
  35. }
  36. rep(k, 1, s[i])
  37. for(int j = sum/2; j >= a[k]; j--)
  38. dp[j] = max(dp[j], dp[j-a[k]] + a[k]);
  39. ans += max(dp[sum/2], sum - dp[sum/2]);
  40. }
  41. cout << ans;
  42. return 0;
  43. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注