제출 #1326238

#제출 시각아이디문제언어결과실행 시간메모리
1326238sh_qaxxorov_571Collecting Stamps 3 (JOI20_ho_t3)C++20
0 / 100
1 ms568 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

const long long INF = 1e18;

// DP holati: dp[i][j][k][pos]
// i - soat mili bo'yicha olingan shtamplar soni (o'ngga)
// j - soat miliga qarshi olingan shtamplar soni (chapga)
// k - jami to'plangan shtamplar soni
// pos - hozirgi turgan joy (0: o'ng tomondagi oxirgi nuqtada, 1: chap tomondagi oxirgi nuqtada)
long long dp[205][205][205][2];

int main() {
    int N;
    long long L;
    cin >> N >> L;

    vector<long long> X(N + 2), T(N + 2);
    for (int i = 1; i <= N; i++) cin >> X[i];
    for (int i = 1; i <= N; i++) cin >> T[i];

    // Chegaraviy qiymatlarni o'rnatamiz (0 - boshlang'ich nuqta)
    X[0] = 0; X[N + 1] = L;
    
    // DPni cheksizlik bilan to'ldiramiz
    for (int i = 0; i <= N; i++)
        for (int j = 0; i + j <= N; j++)
            for (int k = 0; k <= N; k++)
                dp[i][j][k][0] = dp[i][j][k][1] = INF;

    dp[0][0][0][0] = dp[0][0][0][1] = 0;

    for (int i = 0; i <= N; i++) {
        for (int j = 0; i + j <= N; j++) {
            for (int k = 0; k <= i + j; k++) {
                if (dp[i][j][k][0] == INF && dp[i][j][k][1] == INF) continue;

                // Hozirgi koordinatalar
                long long curX_R = X[i];
                long long curX_L = (j == 0) ? 0 : X[N - j + 1];

                // 1. O'ngdan o'ngga o'tish (i -> i+1)
                if (i + j < N) {
                    long long nextX = X[i + 1];
                    // Holat 0 dan (o'ngdan) o'ngga
                    long long time0 = dp[i][j][k][0] + (nextX - curX_R);
                    int nextK = k + (time0 <= T[i + 1] ? 1 : 0);
                    dp[i + 1][j][nextK][0] = min(dp[i + 1][j][nextK][0], time0);

                    // Holat 1 dan (chapdan) o'ngga
                    long long time1 = dp[i][j][k][1] + (curX_L == 0 ? nextX : (L - curX_L + nextX));
                    nextK = k + (time1 <= T[i + 1] ? 1 : 0);
                    dp[i + 1][j][nextK][0] = min(dp[i + 1][j][nextK][0], time1);
                }

                // 2. Chapga o'tish (j -> j+1)
                if (i + j < N) {
                    long long nextX = X[N - j];
                    // Holat 0 dan (o'ngdan) chapga
                    long long time0 = dp[i][j][k][0] + (curX_R == 0 ? (L - nextX) : (curX_R + L - nextX));
                    int nextK = k + (time0 <= T[N - j] ? 1 : 0);
                    dp[i][j + 1][nextK][1] = min(dp[i][j + 1][nextK][1], time0);

                    // Holat 1 dan (chapdan) chapga
                    long long time1 = dp[i][j][k][1] + (curX_L - nextX);
                    if (j == 0) time1 = L - nextX; // Boshlang'ich holatdan chapga
                    nextK = k + (time1 <= T[N - j] ? 1 : 0);
                    dp[i][j + 1][nextK][1] = min(dp[i][j + 1][nextK][1], time1);
                }
            }
        }
    }

    // Maksimal k ni topamiz
    int ans = 0;
    for (int i = 0; i <= N; i++)
        for (int j = 0; i + j <= N; j++)
            for (int k = 0; k <= N; k++)
                if (dp[i][j][k][0] != INF || dp[i][j][k][1] != INF)
                    ans = max(ans, k);

    cout << ans << endl;

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...