Submission #1301849

#TimeUsernameProblemLanguageResultExecution timeMemory
1301849nicolo_010Boxes with souvenirs (IOI15_boxes)C++20
10 / 100
8 ms15944 KiB
#include <bits/stdc++.h>
#include "boxes.h"
using namespace std;
using ll = long long;
using pii = pair<int, int>;

const int mxN = 1e6+5;

ll memo[mxN][2];

vector<int> pos;

int L, k, n;

ll solve(int i, int t) {
	if (i >= pos.size()) return 0;
	if (memo[i][t] != -1) return memo[i][t];
	ll result=1e18;
	int md = n%k;
	//Va a quedar un bloque de tamaño md;

	//Caso bloque de k
	if (i+k <= n) {
		int s = k;
		int l = pos[i];
		int r = pos[i+s-1];
		ll cost = min(2*min(r, L-l), L);
		result = min(result, cost + solve(i+s, t));
	}

	//Caso bloque de md
	if (t==0 && i+md <= n && n%k != 0) {
		int s = md;
		int l = pos[i];
		int r = pos[i+s-1];
		ll cost = min(2*min(r, L-l), L);
		result = min(result, cost + solve(i+s, 1));
	}
	memo[i][t] = result;
	return memo[i][t];
}

ll delivery(int N, int K, int l, int* a) {
	n = N;
	k = K;
	L = l;
	pos.assign(n, 0);
	for (int i=0; i<n; i++) {
		pos[i] = a[i];
	}
	memset(memo, -1, sizeof(memo));
	return solve(0, 0);
}
#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...