1 条题解
-
0
这里的 是题目中的 , 是题目中的 。
由于有 种方式:
- 不做:不花费时间,不获取分数
- 不可以总司令(骗分):花费 时间,获取 分数。
- 想正解:花费 时间,获取 分数。
因此珂以 dp。
设 为 时间内做前 道题最大得分,有
$$f(i, j) = \max\{f(i - 1, j), f(i - 1, j - t1_i) + s1_i, f(i - 1, j - t2_i) + s2_i\} $$注意到珂以把二维的改成一维的,很简单就不讲了((
#include "bits/stdc++.h" using namespace std; int f[1919810]; int s1[1919810], s2[1919810], t1[1919810], t2[1919810]; inline void rd(int& x) { x = 0; char c = getchar(); while (c < '0' || c > '9') c = getchar(); while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - 48, c = getchar(); } inline void wt(int x) { if (x == 0) return; wt(x / 10); putchar((x % 10) + 48); } inline void wwt(int x) { if (x == 0) putchar('0'); else wt(x); } int main() { int n, T; rd(n); rd(T); // n *= 2; for (int i = 1; i <= n; ++i) { rd(s1[i]); rd(t1[i]); rd(s2[i]); rd(t2[i]); if (t2[i] > t1[i]) { swap(t1[i], t2[i]); swap(s1[i], s2[i]); } } for (int i = 1; i <= n; ++i) { for (int j = T; j >= t1[i]; --j) { f[j] = max(f[j], max(f[j - t1[i]] + s1[i], f[j - t2[i]] + s2[i])); } for (int j = t1[i] - 1; j >= t2[i]; --j) { f[j] = max(f[j], f[j - t2[i]] + s2[i]); } } wwt(f[T]); }
- 1
信息
- ID
- 283
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- (无)
- 递交数
- 48
- 已通过
- 23
- 上传者