1 条题解
-
0
#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
- 上传者