Submission #1130485

#TimeUsernameProblemLanguageResultExecution timeMemory
1130485m_bezrutchkaKitchen (BOI19_kitchen)C++20
0 / 100
235 ms2004 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

const int LLINF = 2e18 + 10;
const int MAXN = 45;
const int MAXS = 1700;

bool dp[MAXN][MAXN][MAXN * MAXN];
int a[MAXN], b[MAXN];

void solve() {
  int n, m, k;
  cin >> n >> m >> k;
  int sum_a = 0;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    sum_a += a[i];
    if (a[i] < k) {
      cout << "Impossible\n";
      return;
    }
  }

  dp[0][0][0] = true;
  for (int i = 1; i <= m; i++) {
    cin >> b[i];
    int x = b[i];
    // cout << "processing x = " << x << endl;
    for (int r = k; r >= 1; r--) {
      for (int c = n; c >= 1; c--) {
        for (int s = MAXS - 1; s >= 0; s--) {
          int pr, pc, lo;
          if (x >= n) {
            if (r == 1) {
              pr = 0;
              pc = 0;
              lo = x - c;
            } else {
              pr = r - 1;
              pc = c;
              lo = x - n;
            }
          } else if (x < c) {
            pr = r;
            pc = x - c;
            lo = 0;
          } else {
            if (r == 1) {
              pr = 0;
              pc = 0;
              lo = x - c;
            } else {
              pr = r - 1;
              pc = n - (x - c);
              lo = 0;
            }
          }
          // printf("r = %lld c = %lld s = %lld checking pr = %lld pc = %lld lo = %lld\n", r, c, s, pr, pc, lo);
          if (lo <= s && pr >= 0 && pc >= 0 && dp[pr][pc][s - lo]) {
            dp[r][c][s] = true;
            // printf("dp[%lld][%lld][%lld] = dp[%lld][%lld][%lld] = true\n", r, c, s, pr, pc, s - lo);
          }
          if (x <= s && dp[r][c][s - x]) {
            dp[r][c][s] = true;
            // printf("2 dp[%lld][%lld][%lld] = dp[%lld][%lld][%lld] = true\n", r, c, s, r, c, s - x);
          }
        }
      }
    }
  }
  int mini = sum_a - k * n;
  for (int s = mini; s < MAXS; s++) {
    if (dp[k][n][s]) {
      cout << s + k * n - sum_a << "\n";
      return;
    }
  }
  cout << "Impossible\n";
}

int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  solve();
  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...