1 条题解
-
1
#include <cstdio> #include <algorithm> const int maxN = 505, maxM = 205; int n, m, mm, ans = 1e9, t[maxN], g[maxN][maxM]; int main() { scanf("%d%d", &n, &m); mm = m + m; for (int i = 1; i <= n; i++) { scanf("%d", &t[i]); } std::sort(t + 1, t + n + 1); // 排序. for (int i = 1; i <= n; i++) { g[i][0] = 1e9; // 先特判 j = 0 的情况. for (int j = 0; j <= std::min(t[i] - t[i - 1] - m, m - 1); j++) { g[i][0] = std::min(g[i][0], g[i - 1][j]); } for (int j = 1; j < mm; j++) { g[i][j] = std::min(g[i][j - 1], t[i] + j - t[i - 1] - m >= 0 && t[i] + j - t[i - 1] - m < mm ? g[i - 1][t[i] + j - t[i - 1] - m] : (int) 1e9); } // 前缀最大值维护新开一段的情况. for (int j = 0; j < mm; j++) { g[i][j] = std::min(g[i][j], t[i] + j - t[i - 1] < mm ? g[i - 1][t[i] + j - t[i - 1]] : (int) 1e9) + j; } // 分在同一段内的情况, 加上 j 的贡献. } for (int i = 0; i < m; i++) { ans = std::min(ans, g[n][i]); } printf("%d\n", ans); return 0; }
- 1
信息
- ID
- 3945
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 17
- 已通过
- 5
- 上传者