제출 #1349402

#제출 시각아이디문제언어결과실행 시간메모리
1349402kantaponz선물상자 (IOI15_boxes)C++20
0 / 100
0 ms344 KiB
#include "boxes.h"
#include <bits/stdc++.h>
using namespace std;

#define ll long long

long long delivery(int N, int K, int L, int p[]) {
    ll dp[N];
    fill(dp, dp + N, 1e18);
    dp[0] = 2 * (p[0] - 0);
    dp[N - 1] = 2 * (L - p[N - 1]);
    for (int i = 1; i < N; i++) dp[i] = min(dp[i], dp[i - 1] + 2 * (p[i] - p[i - 1]));
    for (int i = N - 2; i >= 0; i--) dp[i] = min(dp[i], dp[i + 1] + 2 * (p[i + 1] - p[i]));
    int l = -1, r = N;
    int mid = L / 2;
    ll ans = 0;
    while (p[min(N - 1, l + 1)] == 0 && l + 1 < N) l++;
    while (p[min(N - 1, l + K)] <= mid && l + K < N) {
        l += K;
        ans += dp[l];
    }
    while (p[max(0, r - K) && r - K >= 0] > mid) {
        r -= K;
        ans += dp[r];
    }

    //cout << ans << " " << l << " " << r << " " << r - l - 1 << "\n";

    if (r - l == 1) return ans;

    if (p[l + 1] > mid) return ans + dp[l + 1];

    if (p[r - 1] <= mid) return ans + dp[r - 1];

    if (r - l - 1 <= K) return ans + L;
    
    return ans + L + min(dp[min(N - 1, l + K + 1)], dp[r - K - 1]);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...