Submission #1234110

#TimeUsernameProblemLanguageResultExecution timeMemory
1234110madamadam3Packing Biscuits (IOI20_biscuits)C++20
0 / 100
13 ms328 KiB
#include "biscuits.h"
#include <bits/stdc++.h>

using namespace std;

#ifdef LOCAL
	#define dbg(x) (cout << (x))
#else
	#define dbg(x)
#endif

typedef long long ll;
using vi =vector<int>;
using vl = vector<ll>;
#define pb push_back
#define FOR(i, a, b) for (int i = a; i < b; i++)
#define trace(x) for (auto &el : x) {dbg(el); dbg(" ");}

ll count_tastiness(ll x, vl a) {
	ll k = a.size();
	const ll BITS = 31;
	ll SUM = 0;
	for (ll i = 0; i < k; i++) SUM += a[i] * (1 << i);
	SUM /= x;

	a.resize(max(k, BITS));
	trace(a); dbg("\n");

	// dbg("x: "); dbg(x); dbg(" k: "); dbg(k); dbg("\n");

	vl DP(BITS+1, 0);
	DP[0] = 1;

	for (ll i = 0; i < BITS; i++) {
		ll mysum = DP[i];
		if (a[i] >= x) {
			mysum *= 2;
		} else {
			int best = -1;
			for (int bg = 0; bg < i; bg++) {
				vl tmpa(a.begin(), a.end());
				for (int en = bg; en < i; en++) {
					tmpa[en+1] += tmpa[en] / 2;
					tmpa[en] -= (tmpa[en] / 2) * 2;
				}
				if (tmpa[i] >= x) {
					best = bg;
				}
			}
			if (best != -1) mysum += DP[best];
		}

		DP[i+1] = mysum;
		ll remainder = max(0LL, a[i] - x);
		ll to_give = remainder / 2;
		if (i < BITS - 1) a[i+1] += to_give;
		a[i] -= to_give * 2;
	}

	return DP[BITS];
}

#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...