Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- vector<long long> Brut(int n, int cost_add, int cost_rem, int cost_dbl) {
- vector<long long> dp(4 * n, 2e18);
- dp[1] = 0;
- int ch = 1;
- while (ch--) {
- auto relax = [&](int node, long long val) {
- if (node < 0 || node >= (int)dp.size() || dp[node] <= val)
- return;
- dp[node] = val;
- ch = 1;
- };
- for (int i = 0; i < (int)dp.size() - 1; ++i) {
- relax(i - 1, dp[i] + cost_rem);
- relax(i + 1, dp[i] + cost_add);
- relax(2 * i, dp[i] + cost_dbl);
- }
- }
- dp.resize(n + 1);
- return dp;
- }
- long long Solve(int n, int cost_add, int cost_rem) {
- long long dp[2] = {0, cost_add}, nxt[2];
- int bit;
- for (bit = 0; (1 << bit) <= n; ++bit);
- for (--bit; bit >= 0; --bit) {
- if (n & (1 << bit)) {
- nxt[0] = min(dp[0] + cost_add, dp[1] + cost_rem);
- nxt[1] = dp[1];
- } else {
- nxt[0] = dp[0];
- nxt[1] = min(dp[1] + cost_rem, dp[0] + cost_add);
- }
- swap(dp, nxt);
- }
- return dp[0];
- }
- long long Solve(int n, int cost_add, int cost_rem, int cost_dbl) {
- long long best = 2e18;
- for (int a = 0; a <= 30; ++a) {
- int now = (1 << a);
- if (now > 2 * n) break;
- long long cost = 1LL * cost_dbl * a;
- cost += cost_add * (n / now);
- cost += Solve(n % now, cost_add, cost_rem) - cost_add;
- best = min(best, cost);
- }
- return best;
- }
- int main() {
- while (true) {
- int n = 100000;
- int a = rand() % 100, b = rand() % 100, c = rand() % 100;
- auto chk = Brut(n, a, b, c);
- for (int i = 1; i <= n; ++i) {
- long long have = Solve(i, a, b, c);
- if (chk[i] != have) {
- cerr << "ERROR: " << i << " " << a << " " << b << " " << c << endl;
- cerr << "EXPECTED: " << chk[i] << endl;
- cerr << "GOT: " << have << endl;
- return 0;
- }
- }
- cerr << "OK!" << endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement