1 条题解

  • 0
    @ 2023-1-17 11:16:40

    这里的 s1is1_i 是题目中的 w1iw1_is2is2_i 是题目中的 w2iw2_i

    由于有 33 种方式:

    • 不做:不花费时间,不获取分数
    • 不可以总司令(骗分):花费 t2it2_i 时间,获取 s2is2_i 分数。
    • 想正解:花费 t1it1_i 时间,获取 s1is1_i 分数。

    因此珂以 dp。

    f(i,j)f(i, j)jj 时间内做前 ii 道题最大得分,有

    $$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
    上传者