Cod sursa(job #2164313)

Utilizator MoodyFaresFares Mohamad MoodyFares Data 12 martie 2018 22:46:49
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <cstdio>
#include <algorithm>

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;
  while (left <= right) {
    int t = (left + right) >> 1;
    for (int i = 0; i <= 100; i++) {
      for (int j = 0; j <= 100; j++) {
        d[i][j] = -100;
      }
    }
    d[0][0] = 0;
    for (int i = 1; i <= n; i++) {
      for (int A = 0; A <= l; A++) {
        for (int _A = 0; _A <= t / a[i] && _A <= A; _A++) {
          d[i][A] = std::max(d[i][A], d[i - 1][A - _A] + (t - a[i] * _A) / b[i]);
        }
      }
    }
    bool sePoate = d[n][l] >= l;
    if (sePoate) {
      right = t - 1;
    } else {
      left = t + 1;
    }
  }
  printf("%d\n", left);
  for (int i = 0; i <= 100; i++) {
    for (int j = 0; j <= 100; j++) {
      d[i][j] = -100;
    }
  }
  d[0][0] = 0;
  for (int i = 1; i <= n; i++) {
    for (int A = 0; A <= l; A++) {
      for (int _A = 0; _A <= left / a[i] && _A <= A; _A++) {
        d[i][A] = std::max(d[i][A], d[i - 1][A - _A] + (left - a[i] * _A) / b[i]);
      }
    }
  }
  int last = l;
  for (int i = n; i >= 1; i--) {
    for (int _A = 0; _A <= left / a[i] && _A <= last; _A++) {
      if (d[i][last] == d[i - 1][last - _A] + (left - a[i] * _A) / b[i]) {
        x[i] = _A;
        y[i] = (left - a[i] * _A) / b[i];
        last -= _A;
        break;
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    printf("%d %d\n", x[i], y[i]);
  }
  return 0;
}