Submission #175901

#TimeUsernameProblemLanguageResultExecution timeMemory
175901AlexLuchianovKitchen (BOI19_kitchen)C++14
100 / 100
162 ms3348 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <bitset>

using namespace std;

using ll = long long;
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define MAX(a, b) (((a) < (b)) ? (b) : (a))
int const nmax = 300;
int const inf = 1000000000;

int v[5 + nmax], v2[5 + nmax];
bitset<5 + nmax * nmax> dpinit, dp[5 + nmax];
int dist[5 + nmax * nmax];

int main()
{
  int n, k, m;
  cin >> n >> m >> k;
  int sum = 0;
  for(int i = 1;i <= n; i++) {
    cin >> v[i];
    sum += v[i];
    if(v[i] < k) {
      cout << "Impossible";
      return 0;
    }
  }
  dpinit[0] = 1;
  int ptr = 0;
  dp[0][0] = 1;
  for(int i = 1;i <= m; i++) {
    cin >> v2[i];
    if(v2[i] < n)
      dpinit |= (dpinit<<v2[i]);
    else{
      for(int j = ptr; 0 <= j; j--)
        dp[j + 1] |= (dp[j]<<v2[i]);
      ++ptr;
    }
  }
  dist[n * nmax + 1] = inf;
  for(int i = n * nmax; 0 <= i; i--){
    if(dpinit[i] == 1)
      dist[i] = 0;
    else
      dist[i] = dist[i + 1] + 1;
  }

  int result = inf;
  for(int i = 0; i <= ptr; i++){
    for(int j = 0; j <= i * nmax; j++){
      if(dp[i][j] == 1){
        int diff = MAX(n * k - i * n, sum - j);
        if(diff <= 0)
          result = MIN(result, j - sum);
        else
          result = MIN(result, dist[diff] + diff + j - sum);
      }
    }
  }

  if(1 + nmax * nmax <= result)
    cout << "Impossible";
  else
    cout << result;
  return 0;
}
#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...