| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1324032 | sh_qaxxorov_571 | 선물상자 (IOI15_boxes) | C++20 | 0 ms | 0 KiB |
#include "souvenirs.h"
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
/**
* Aman uchun minimal vaqtni hisoblash funksiyasi.
* N - jamoalar soni, K - sig'im, L - aylana uzunligi.
*/
ll delivery(int N, int K, int L, int positions[]) {
// pre[i] - dastlabki i ta jamoaga soat yo'nalishi bo'yicha borib kelish vaqti
vector<ll> pre(N + 1, 0);
// suf[i] - oxirgi i ta jamoaga soat yo'nalishiga qarshi borib kelish vaqti
vector<ll> suf(N + 1, 0);
// Soat yo'nalishi bo'yicha DP
for (int i = 1; i <= N; i++) {
int dist = positions[i - 1];
if (i <= K) {
pre[i] = 2LL * dist;
} else {
pre[i] = pre[i - K] + 2LL * dist;
}
}
// Soat yo'nalishiga qarshi DP
for (int i = 1; i <= N; i++) {
int dist = L - positions[N - i];
if (i <= K) {
suf[i] = 2LL * dist;
} else {
suf[i] = suf[i - K] + 2LL * dist;
}
}
// Holat 1: Hech qanday to'liq aylanishsiz (hamma yo o'ngdan, yo chapdan boradi)
ll ans = 1e18; // Juda katta son
for (int i = 0; i <= N; i++) {
ans = min(ans, pre[i] + suf[N - i]);
}
// Holat 2: Bitta to'liq aylanish orqali K ta jamoani qoplash
// i ta jamoa o'ngdan, j ta jamoa chapdan, o'rtadagi K ta jamoa bir aylanishda
for (int i = 0; i <= N - K; i++) {
ans = min(ans, pre[i] + suf[N - K - i] + (ll)L);
}
return ans;
}
