Cod sursa(job #2098951)

Utilizator DruffbaumPopescu Vlad Druffbaum Data 3 ianuarie 2018 19:29:43
Problema Lapte Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <cstdio>

const int MAXN = 1e2;
const int INF = 2e9;
#define CB (1 << 17)

int d[MAXN + 2][MAXN + 2], p[MAXN + 2][MAXN + 2],
    a[MAXN + 2], b[MAXN + 2];

int fn(int t, int n, int l) {
  for (int i = 0; i <= n; ++i) {
    for (int j = 0; j <= l; ++j) {
      d[i][j] = -INF;
    }
  }
  d[0][0] = 0;
  for (int i = 1; i <= n; ++i) {
    for (int j = 0; j <= l; ++j) {
      for (int k = 0; k <= j; ++k) {
        if (d[i - 1][k] != -INF && (j - k) * a[i] <= t && 
            d[i][j] < d[i - 1][k] + (t - (j - k) * a[i]) / b[i]) {
          d[i][j] = d[i - 1][k] + (t - (j - k) * a[i]) / b[i];
          p[i][j] = k;
        }
      }
    }
  }
  return d[n][l];
}

int main() {
  int n, l, i, t;
  FILE *f = fopen("lapte.in", "r");
  fscanf(f, "%d%d", &n, &l);
  for (int i = 1; i <= n; ++i) {
    fscanf(f, "%d%d", &a[i], &b[i]);
  }
  fclose(f);
  for (i = 1; (i << 1) <= CB; i <<= 1);
  for (t = i + 1; i > 0; i >>= 1) {
    if (t - i >= 1 && fn(t - i, n, l) >= l) {
      t -= i;
    }
  }
  for (int i = n; i > 0; --i) {
    a[i] = l - p[i][l];
    b[i] = d[i][l] - d[i - 1][p[i][l]];
    l = p[i][l];
  }
  f = fopen("lapte.out", "w");
  fprintf(f, "%d\n", t);
  for (int i = 1; i <= n; ++i) {
    fprintf(f, "%d %d\n", a[i], b[i]);
  }
  fclose(f);
  return 0;
}