1 条题解

  • 0
    @ 2025-4-11 15:00:09
    #include <bits/stdc++.h>
    #define int long long
    using namespace std;
    const int MAXN = 300;
    const int MAXM = 1'000'000;
    const int INF = MAXN * MAXM + 5;
    int n, m;
    int x[MAXN + 5];
    // 一共喝 num 滴水,喝完了 l~r 的水,停在了 左0/右1 的最小总消耗
    int f[MAXN + 5][MAXN + 5][2];
    signed main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n >> m;
        for (int i = 1; i <= n; i++)
            cin >> x[i];
    
        sort(x + 1, x + n + 1);
        int ans = 0;
        // 碰了 num 滴水
        for (int num = 1; num <= n; num++)
        {
            // 计算 f[l][r][0/1]
            for (int len = 1; len <= num; len++)
            {
                for (int l = 1; l + len - 1 <= n; l++)
                {
                    int r = l + len - 1;
                    f[l][r][0] = f[l][r][1] = INF;
                    if (len == 1)
                    {
                        // 所有水珠都在消耗
                        f[l][r][0] = f[l][r][1] = abs(x[l]) * num;
                        continue;
                    }
                    int rem = num - len + 1; // 还有几个在消耗
                    // l+1 -> l
                    f[l][r][0] = min(f[l][r][0],
                                     f[l + 1][r][0] + (x[l + 1] - x[l]) * rem);
                    // r -> l
                    f[l][r][0] = min(f[l][r][0],
                                     f[l + 1][r][1] + (x[r] - x[l]) * rem);
                    // l -> r
                    f[l][r][1] = min(f[l][r][1],
                                     f[l][r - 1][0] + (x[r] - x[l]) * rem);
                    // r+1 -> r
                    f[l][r][1] = min(f[l][r][1],
                                     f[l][r - 1][1] + (x[r] - x[r - 1]) * rem);
                }
            }
            for (int l = 1; l + num - 1 <= n; l++)
            {
                ans = max(ans, num * m - f[l][l + num - 1][0]);
                ans = max(ans, num * m - f[l][l + num - 1][1]);
            }
        }
        cout << ans;
        return 0;
    }
    
    • 1

    信息

    ID
    13393
    时间
    4000ms
    内存
    16MiB
    难度
    8
    标签
    递交数
    28
    已通过
    5
    上传者