Skip to main content
  1. Posts/

CodeForces-1324E Sleeping Schedule

·2 mins·

CodeForces-1324E Sleeping Schedule #

题目大意 #

给定 $h, l, r$ 和长度为 $n$ 的数组 $a$ . 对于每个 $a_i$ , 你可以用 $a_i - 1$ 替换它. 记 $s$ 为经过操作的 $a$ 的前缀和数组, 如果 $l\leq (s_i% h)\leq r$ , 就得到一分. 求总得分的最大值.

Solution 1 #

用 $dp[i][j]$ 表示 $a_0, …, a_i$ 中有 $j$ 个数被替换时的最大得分. 动态规划即可. 代码如下:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, h, l, r;
    cin >> n >> h >> l >> r;
    int a[n];
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        if (i > 0) {
            a[i] += a[i - 1];
        }
    }
    vector<vector<int>> dp(n, vector<int>(n + 1, 0));
    dp[0][0] = (l <= a[0] % h) && (r >= a[0] % h);
    dp[0][1] = (l <= (a[0] - 1) % h) && (r >= (a[0] - 1) % h);
    for (int i = 1; i < n; i++) {
        for (int j = 0; j <= i + 1; j++) {
            dp[i][j] =
                ((l <= (a[i] - j) % h) && (r >= (a[i] - j) % h)) +
                (j > 0 ? max(dp[i - 1][j - 1], dp[i - 1][j]) : dp[i - 1][j]);
        }
    }
    int ans = 0;
    for (int j = 0; j <= n; j++) {
        ans = max(ans, dp[n - 1][j]);
    }
    cout << ans << endl;
    return 0;
}