多校联合暑假训练赛第一场

youhualiuh / 2024-07-20 / 原文

B. 对数组的最小操作次数

Code:

#include<bits/stdc++.h>
    
using namespace std;
const int N = 2e5 + 5;
int dp[N][8], n, k, a[N];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin >> n >> k;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    } 
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= 7; j++) dp[i][j] = INT_MAX;
    }
    for (int i = 1; i <= 7; i++) {
        dp[1][i] = (a[1] != i) ? 1 : 0;
    }
    for (int i = 2; i <= n; i++) {
        for (int j = 1; j <= 7; j++) {
            for (int p = max(1, j - k); p <= min(7, j + k); p++) {
                dp[i][j] = min(dp[i][j], dp[i - 1][p] + (a[i] != j));
            }
        }
    }
    int ans = INT_MAX;
    for (int i = 1; i <= 7; i++) {
        ans = min(ans, dp[n][i]);
    }
    cout << ans;
    return 0;
}

  

J. 最大和

#include<bits/stdc++.h>
    
using namespace std;
typedef long long ll;
const int N = 1e2 + 5;
const ll inf = 1e18;
ll a[N], dp[N][N];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int n, k, d;
    cin >> n >> k >> d;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) dp[i][j] = -inf;
    }
    dp[0][0] = 0;
    for (int i = 1; i <= n; i++) {
        for (int j = k; j >= 1; j--) {
            for (int l = 0; l < d; l++) {
                if (dp[j - 1 ][l] != -inf) {
                    dp[j][(l + a[i]) % d] = max(dp[j][(l + a[i]) % d], dp[j - 1][l] + a[i]);
                }
            }
        }
    }
    cout << (dp[k][0] == -inf ? -1 : dp[k][0]);
    return 0;
}