제출 #1195792

#제출 시각아이디문제언어결과실행 시간메모리
1195792DeathIsAwe선물상자 (IOI15_boxes)C++20
10 / 100
0 ms328 KiB
#include "boxes.h"
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define ff first
#define ss second
#define ll long long
using namespace std;
ll dp[10000000], revdp[10000000], n, k, l;
vector<ll> p;


ll delivery(int N, int K, int L, int P[]) {
    n = N; k = K; l = L;
    for (int i=0;i<N;i++) {
        if (P[i] == 0) n -= 1;
        else p.pb(P[i]);
        dp[i] = 0;
        revdp[i] = 0;
    }
    dp[n] = 0; revdp[0] = 0;
    
    
    
    dp[0] = 0; revdp[0] = 0;
    for (int i=0;i<n;i++) {
        dp[i + 1] = min(l, 2 * p[i]) + dp[max((ll)0, i + 1 - k)];
    }
    for (int i=0;i<n;i++) {
        revdp[i + 1] = min(l, 2 * (l - p[n - i - 1])) + revdp[max((ll)0, i + 1 - k)];
    }


    ll ans = INT64_MAX, count = 0;
    if (l % 2 == 0) {
        for (int i=0;i<n;i++) {
            if (p[i] == l/2) count += 1;
        }
    }
    if (count % k != 0) {
        count = k * (count / k + 1);
    }


    //cout << dp[1] << ' ' << dp[2] << ' ' << dp[3] << endl;
    //cout << revdp[1] << ' ' << revdp[2] << ' ' << revdp[3] << endl;
    for (int i=0;i<n;i++) {
        ans = min(ans, dp[max((ll)0, i - count + 1)] + revdp[max((ll)0, n - i - 1)] + (count / k) * l);
        //cout << ans << endl;
    }
    cout << endl;
    count += k;
    for (int i=0;i<n;i++) {
        ans = min(ans, dp[max((ll)0, i - count + 1)] + revdp[max((ll)0, n - i - 1)] + (count / k) * l);
        //cout << ans << endl;
    }


    if (ans == INT64_MAX) return 0;
    return ans;
}
#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...