# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1246416 | SpyrosAliv | Boxes with souvenirs (IOI15_boxes) | C++20 | 0 ms | 0 KiB |
#include "boxes.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n, k, l;
const ll INF = 1e13;
long long delivery(int N, int K, int L, int p[]) {
n = N;
k = K;
l = L;
ll ans = n * L;
vector<int> ord;
for (int i = 0; i < n; i++) ord.push_back(i);
do {
vector<ll> dp(k+1);
for (int i = 0; i < k; i++) dp[i] = INF;
dp[k] = 0;
ll pos = 0;
for (int i = 0; i < n; i++) {
ll nxt = p[ord[i]];
ll minDis = min(abs(nxt - pos), L - abs(nxt - pos));
vector<ll> dp2;
dp2 = dp;
dp2[k] = INF;
for (int kk = 1; kk <= k; kk++) {
dp2[kk-1] = min(INF, dp[kk] + minDis);
if (kk < k) dp2[k] = min(dp2[k], dp[kk] + min(pos, L - pos) + min(nxt, L - nxt));
}
dp2[k] = min(dp2[k], dp[0] + min(pos, L - pos) + min(nxt, L - nxt));
pos = p[ord[i]];
dp = dp2;
}
ll minDis = min(pos, L - pos);
for (int i = 0; i <= k; i++) {
ans = min(ans, minDis + dp[i]);
}
} while (next_permutation(ord.begin(), ord.end()));
return ans;
}
signed main() {
int n, k, l; cin >> n >> k >> l;
int p[n];
for (int i = 0; i < n; i++) cin >> p[i];
cout << delivery(n, k, l, p) << "\n";
}