제출 #1242456

#제출 시각아이디문제언어결과실행 시간메모리
1242456KindaGoodGamesBoxes with souvenirs (IOI15_boxes)C++20
0 / 100
1 ms584 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;
map<pii, int> opt;
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 lo = max(0LL,opt[{max(0LL,l-K), r}]);
    int hi = min(K,opt[{l, max(0LL,r-K)}]);

    int mi = INF;
    int o = -1;
    for(int t = lo; t <= hi; t++){
        if(t == 0 && r == 0) continue;
        if(t == K && l == 0) continue;
        int cost = 0;
        // edge case, if you don't move, you don't need to the distance of it 
        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));
        int c = rec(nl,nr);
        if(mi > c+cost){ 
            mi = min(mi, c + cost); 
            o = t;
        }
    } 
    dp[{l,r}] = mi;
    opt[{l,r}] = o;
    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...