1 条题解

  • 1
    @ 2022-7-20 21:37:04
    #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
    上传者