Advertisement
Guest User

Untitled

a guest
Jan 25th, 2020
514
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.88 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. vector<long long> Brut(int n, int cost_add, int cost_rem, int cost_dbl) {
  6.   vector<long long> dp(4 * n, 2e18);
  7.   dp[1] = 0;
  8.   int ch = 1;
  9.   while (ch--) {
  10.     auto relax = [&](int node, long long val) {
  11.       if (node < 0 || node >= (int)dp.size() || dp[node] <= val)
  12.         return;
  13.       dp[node] = val;
  14.       ch = 1;
  15.     };
  16.     for (int i = 0; i < (int)dp.size() - 1; ++i) {
  17.       relax(i - 1, dp[i] + cost_rem);
  18.       relax(i + 1, dp[i] + cost_add);
  19.       relax(2 * i, dp[i] + cost_dbl);
  20.     }
  21.   }
  22.   dp.resize(n + 1);
  23.   return dp;
  24. }
  25.  
  26. long long Solve(int n, int cost_add, int cost_rem) {
  27.   long long dp[2] = {0, cost_add}, nxt[2];
  28.   int bit;
  29.   for (bit = 0; (1 << bit) <= n; ++bit);
  30.   for (--bit; bit >= 0; --bit) {
  31.     if (n & (1 << bit)) {
  32.       nxt[0] = min(dp[0] + cost_add, dp[1] + cost_rem);
  33.       nxt[1] = dp[1];
  34.     } else {
  35.       nxt[0] = dp[0];
  36.       nxt[1] = min(dp[1] + cost_rem, dp[0] + cost_add);
  37.     }
  38.     swap(dp, nxt);
  39.   }
  40.   return dp[0];
  41. }
  42.  
  43. long long Solve(int n, int cost_add, int cost_rem, int cost_dbl) {
  44.   long long best = 2e18;
  45.   for (int a = 0; a <= 30; ++a) {
  46.     int now = (1 << a);
  47.     if (now > 2 * n) break;
  48.  
  49.     long long cost = 1LL * cost_dbl * a;
  50.     cost += cost_add * (n / now);
  51.     cost += Solve(n % now, cost_add, cost_rem) - cost_add;
  52.     best = min(best, cost);
  53.   }
  54.   return best;
  55. }
  56.  
  57. int main() {
  58.   while (true) {
  59.     int n = 100000;
  60.     int a = rand() % 100, b = rand() % 100, c = rand() % 100;
  61.     auto chk = Brut(n, a, b, c);
  62.     for (int i = 1; i <= n; ++i) {
  63.       long long have = Solve(i, a, b, c);
  64.       if (chk[i] != have) {
  65.         cerr << "ERROR: " << i << " " << a << " " << b << " " << c << endl;
  66.         cerr << "EXPECTED: " << chk[i] << endl;
  67.         cerr << "GOT: " << have << endl;
  68.         return 0;
  69.       }
  70.     }
  71.     cerr << "OK!" << endl;
  72.   }
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement