Submission #1242412

#TimeUsernameProblemLanguageResultExecution timeMemory
1242412KindaGoodGamesBoxes with souvenirs (IOI15_boxes)C++20
50 / 100
2096 ms31948 KiB
#include "boxes.h"
#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>

using namespace std;

const int INF = numeric_limits<int>::max()/2;

map<pii, int> dp;
vector<int> pos;
int n,K,L;

int rec(int l, int r){
    if(dp.count({l,r})) {
        int res = dp[{l,r}];
        return res;
    }
    if(l == 0 && r == 0){
        return 0;
    }

    int mi = INF;
    for(int t = 0; t <= K; t++){
        if(t == 0 && r == 0) continue;
        if(t == K && l == 0) continue;
        int cost = 0;
        if(l-1 >= 0 && t > 0){
            cost += 2*pos[l-1];
        }
        if(n-r < n && t < K){
            cost += (2*(L-pos[n-r]));
        }  
        cost = min(cost, L);

        int nl =max(0LL,l-t);
        int nr = max(0LL,r-(K-t));
        mi = min(mi, rec(nl,nr) + cost);
    }
    dp[{l,r}] = mi;
    return mi;
}

long long delivery(int32_t N, int32_t k, int32_t l, int32_t p[]) {
    n = N;
    K = k;
    L = l;
    pos.resize(n);
    for(int i = 0; i < n; i++){
        pos[i] = p[i];
    }
    sort(pos.begin(),pos.end());

    int mi = INF;
    for(int i = 0; i <= n; i++){
        int c = rec(i, n-i);
        mi = min(mi, c);
    }
    return mi;
}
#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...