Advertisement
Guest User

HashCode 2020 - MorePizza

a guest
Feb 18th, 2020
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.00 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define ull unsigned long long
  3.  
  4. using namespace std;
  5.  
  6. int M, N, value;
  7. vector<long long int> values;
  8. vector<vector<long long int> > dp;
  9. vector<int> path;
  10.  
  11. long long int getSubSetSum(int idx, int sum) {
  12.     if(idx == N) return 0;
  13.     if(dp[idx][sum] == -1) {
  14.         dp[idx][sum] = getSubSetSum(idx + 1, sum);
  15.         if(sum - values[idx] >= 0) {
  16.             dp[idx][sum] = max(values[idx] + getSubSetSum(idx + 1, sum - values[idx]), dp[idx][sum]);
  17.         }
  18.     }
  19.  
  20.     return dp[idx][sum];
  21. }
  22.  
  23. void pathSubSetSum(int idx, long long int sum) {
  24.     if(idx == N) return;
  25.     long long int a = getSubSetSum(idx + 1, sum);
  26.     if(sum - values[idx] >= 0) {
  27.         long long int b = values[idx] + getSubSetSum(idx + 1, sum - values[idx]);
  28.         if(b > a) {
  29.             pathSubSetSum(idx + 1, sum - values[idx]);
  30.             path.push_back(idx);
  31.         } else {
  32.             pathSubSetSum(idx + 1, sum);
  33.         }
  34.     } else {
  35.         pathSubSetSum(idx + 1, sum);
  36.     }
  37. }
  38.  
  39. long long int MAX_OPERATIONS = 300000001;
  40.  
  41. int main(void) {
  42.     //freopen ("in.in", "r", stdin);
  43.     //freopen ("e_also_big.out", "w", stdout);
  44.     cin >> M >> N;
  45.  
  46.     for(int i = 0; i < N; i++) {
  47.         cin >> value;
  48.         values.push_back(value);
  49.     }
  50.  
  51.     unsigned long long int sum = 0;
  52.     int stopIdx = -1;
  53.     unsigned long long int currentSum = 0;
  54.  
  55.     for(int i = N - 1; i >= 0; i--) {
  56.         if(((ull) M - (ull) sum) * ((ull) N - (ull)i) <= (ull) MAX_OPERATIONS) {
  57.             stopIdx = i;
  58.             currentSum = (ull) M - (ull) sum;
  59.             break;
  60.         }
  61.         sum += values[i];
  62.         path.push_back(i);
  63.     }
  64.  
  65.     N = stopIdx + 1;
  66.     dp = vector<vector<long long int> >(stopIdx + 1, vector<long long int>(currentSum + 1, -1));
  67.  
  68.     pathSubSetSum(0, currentSum);
  69.     sort(path.begin(), path.end());
  70.  
  71.     cout << path.size() << endl;
  72.     for(int i = 0; i < path.size(); i++) {
  73.         cout << path[i] << " ";
  74.     }
  75.     cout << endl;
  76.     return 0;
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement