1 条题解

  • 0
    @ 2025-6-8 16:39:47
    #include <bits/stdc++.h>
    using namespace std;
    // D 井的深度, G 垃圾数量
    int D, G;
    struct Trash
    {
        // 落下的时间、能维持的生命、可以垫高的高度
        int t, f, h;
    };
    Trash a[105];
    bool cmp(Trash a, Trash b)
    {
        return a.t < b.t;
    }
    int f[105][1000 + 5];
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> D >> G;
        for (int i = 1; i <= G; i++)
            cin >> a[i].t >> a[i].f >> a[i].h;
        sort(a + 1, a + G + 1, cmp);
        memset(f, -1, sizeof(f));
        for (int i = 0; i <= 10; i++)
            f[0][i] = 0;
        for (int i = 0; i <= G - 1; i++)
        {
            for (int j = 0; j <= a[G].t; j++)
            {
                // 当前状态为前 i 个垃圾,生命为 j 时的状态
                if (f[i][j] == -1)
                    continue;
                // 加入下一个垃圾时能否修改状态
                if (j < a[i + 1].t)
                    f[i + 1][j] = f[i][j];
                else
                {
                    // 下一个垃圾是吃了还是垫高
                    // 垫高
                    f[i + 1][j] = max(f[i + 1][j], f[i][j] + a[i + 1].h);
                    // 吃了(吃完后的高度不变,生命可以达到 j~j+a[i+1].f)
                    for (int k = j; k <= min(j + a[i + 1].f, a[G].t); k++)
                        f[i + 1][k] = max(f[i + 1][k], f[i][j]);
                }
            }
        }
        // 检查到第几个垃圾的时候能出去
        int pos = G + 1;
        for (int i = 0; i <= G; i++)
            for (int j = 0; j <= a[G].t; j++)
                if (f[i][j] >= D)
                    pos = min(pos, i);
        if (pos != G + 1)
        {
            cout << a[pos].t;
            return 0;
        }
        // 单独计算能活多久
        int ans = 10;
        for (int i = 1; i <= G; i++)
            if (a[i].t <= ans)
                ans += a[i].f;
        cout << ans;
        return 0;
    }
    
    • 1

    信息

    ID
    1744
    时间
    1000ms
    内存
    512MiB
    难度
    4
    标签
    递交数
    14
    已通过
    7
    上传者