#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |