简单DP求助
查看原帖
简单DP求助
750803
_Revenge_楼主2023/3/18 23:38

代码较为冗长但是应该好理解

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef double db;

const int N = 2e5 + 50;
const int M = 1e5 + 50;
const int Mod = 1e9 + 7;

inline int read()
{
    int x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9')
    {
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        x = (x << 1) + (x << 3) + (ch ^ 48);
        ch = getchar();
    }
    return x * f;
}

int t, n, h;

int a[N];

unsigned int f[N][3][2];

signed main()
{
    t = read();
    while (t--)
    {
        memset(f, 0, sizeof(f));
        n = read(), h = read();
        for (int i = 1; i <= n; ++i)
        {
            a[i] = read();
        }
        sort(a + 1, a + n + 1);
        int res = 0;
        f[0][0][0] = h;
        for (int i = 1; i <= n; ++i)
        {
            for (int j = 0; j <= 2; ++j)
            {
                for (int k = 0; k <= 1; ++k)
                {
                    if (j != 2 && f[i - 1][j][k] * 2 > a[i])
                    {
                        f[i][j + 1][k] = max(f[i][j + 1][k], f[i - 1][j][k] * 2 + a[i] / 2);
                    }
                    if (k != 1 && f[i - 1][j][k] * 3 > a[i])
                    {
                        f[i][j][k + 1] = max(f[i][j][k + 1], f[i - 1][j][k] * 3 + a[i] / 2);
                    }
                    if (j != 2 && k != 1 && f[i - 1][j][k] * 6 > a[i])
                    {
                        f[i][j + 1][k + 1] = max(f[i][j + 1][k + 1], f[i - 1][j][k] * 6 + a[i] / 2);
                    }
                    if (j == 0 && k == 0 && f[i - 1][j][k] * 12 > a[i])
                    {
                        f[i][j + 2][k + 1] = max(f[i][j + 2][k + 1], f[i - 1][j][k] * 12 + a[i] / 2);
                    }
                    if (j == 0 && f[i - 1][j][k] * 4 > a[i])
                    {
                        f[i][j + 2][k] = max(f[i][j + 2][k], f[i - 1][j][k] * 4 + a[i] / 2);
                    }
                    if (f[i - 1][j][k] > a[i])
                    {
                        f[i][j][k] = max(f[i][j][k], f[i - 1][j][k] + a[i] / 2);
                    }
                }
            }
            for (int j = 0; j <= 2; ++j)
            {
                for (int k = 0; k <= 1; ++k)
                {
                    if (f[i][j][k] > 0)
                    {
                        res = i;
                        break;
                    }
                }
            }
        }
        printf("%d\n", res);
    }
    return 0;
}
2023/3/18 23:38
加载中...