Advertisement
Mirbek

(D) Сделай равными (Codeforcces)

Feb 4th, 2022
679
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.14 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int N = 1e3 + 5;
  6. const int inf = 1e9;
  7.  
  8. int d[N];
  9.  
  10. int main(){
  11.     for (int i = 0; i < N; i++) {
  12.         d[i] = inf;
  13.     }
  14.     d[1] = 0;
  15.     for (int i = 1; i < N; i++) {
  16.         for (int x = 1; x <= i; x++) {
  17.             int j = i + i / x;
  18.             if (j < N) {
  19.                 d[j] = min(d[j], d[i] + 1);
  20.             }
  21.         }
  22.     }
  23.  
  24.     int T;
  25.     cin >> T;
  26.     while (T--) {
  27.         int n, k;
  28.         cin >> n >> k;
  29.  
  30.         vector <int> b(n);
  31.         vector <int> c(n);
  32.         for (int i = 0; i < n; i++) {
  33.             cin >> b[i];
  34.         }
  35.         for (int i = 0; i < n; i++) {
  36.             cin >> c[i];
  37.         }
  38.  
  39.         int bound = 0;
  40.         for (int i = 0; i < n; i++) {
  41.             bound += d[b[i]];
  42.         }
  43.  
  44.         bound = min(bound, k);
  45.         vector <int> dp(bound + 1);
  46.         for (int i = 0; i < n; i++) {
  47.             int x = d[b[i]];
  48.             for (int j = bound; j >= x; j--) {
  49.                 dp[j] = max(dp[j], dp[j - x] + c[i]);
  50.             }
  51.         }
  52.  
  53.         cout << *max_element(dp.begin(), dp.end()) << endl;
  54.     }
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement