Cod sursa(job #2164247)

Utilizator MoodyFaresFares Mohamad MoodyFares Data 12 martie 2018 22:24:37
Problema Lapte Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

const int MAX_N = 100;
const int MAX_L = 100;

int a[1 + MAX_N];
int b[1 + MAX_N];
int d[1 + MAX_N][1 + MAX_L];
int x[1 + MAX_N];
int y[1 + MAX_N];

int main() {
  freopen("lapte.in", "r", stdin);
  freopen("lapte.out", "w", stdout);
  
  int n, l;
  scanf("%d%d", &n, &l);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d", &a[i], &b[i]);
  }
  int left = 1;
  int right = 100;
  int ans = -1;
  while (left <= right) {
    int t = (left + right) >> 1;
    memset(d, 0, sizeof(d));
    for (int A = 0; A * a[1] <= t; A++) {
      d[1][A] = (t - A * a[1]) / b[1];
    }
    int lim = 0;
    for (int i = 1; i <= n; i++) {
      lim += t / a[i];
    }
    for (int i = 2; i <= n; i++) {
      for (int A = 0; A <= lim; A++) {
        for (int _A = 0; _A <= A; _A++) {
          if (a[i] * (A - _A) <= t)
            d[i][A] = std::max(d[i][A], (t - a[i] * (A - _A) + b[i] * d[i - 1][_A]) / b[i]);
        }
      }
    }
    bool sePoate = false;
    for (int i = l; i <= lim && !sePoate; i++) {
      if (d[n][i] >= l) {
        sePoate = true;
      }
    }
    if (sePoate) {
      right = t - 1;
      ans = t;
    } else {
      left = t + 1;
    }
  }
  printf("%d\n", ans);
  int t = ans;
  memset(d, 0, sizeof(d));
  for (int A = 0; A * a[1] <= t; A++) {
    d[1][A] = (t - A * a[1]) / b[1];
  }
  int lim = 0;
  for (int i = 1; i <= n; i++) {
    lim += t / a[i];
  }
  for (int i = 2; i <= n; i++) {
    for (int A = 0; A <= lim; A++) {
      for (int _A = 0; _A <= A; _A++) {
        if (a[i] * (A - _A) <= t)
          d[i][A] = std::max(d[i][A], (t - a[i] * (A - _A) + b[i] * d[i - 1][_A]) / b[i]);
      }
    }
  }
  int last = 0;
  for (int i = l; i <= lim; i++) {
    if (d[n][i] >= l) {
      last = i;
    }
  }
  for (int i = n; i >= 1; i--) {
    int A = last;
    for (int _A = 0; _A <= A; _A++) {
      if (a[i] * (A - _A) <= t && d[i][A] == (t - a[i] * (A - _A) + b[i] * d[i - 1][_A]) / b[i]) {
        x[i] = A - _A;
        y[i] = d[i][A] - d[i - 1][_A];
        last = _A;
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    printf("%d %d\n", x[i], y[i]);
  }
  return 0;
}