Cod sursa(job #2204384)

Utilizator stefan_creastaStefan Creasta stefan_creasta Data 15 mai 2018 17:37:54
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <cstdio>
#include <algorithm>
using namespace std;
struct Petrecareti {
  int ta, tb;
};
struct Solutie {
  int a, b;
};
int n, l;
const int NMAX = 105;
Petrecareti v[NMAX];
int sepoate[NMAX][NMAX];
int bmax[NMAX][NMAX];
Solutie sol[NMAX];
bool vf(int t) {
  for(int i = 0; i <= n; ++i) {
    for(int j = 0; j <= l; ++j) {
      sepoate[i][j] = -1e9;
    }
  }
  for(int i = 1; i <= n; ++i) {
    for(int j = 0; j <= l; ++j) {
      bmax[i][j] = (t - j * v[i].ta) / v[i].tb;
    }
  }
  sepoate[0][0] = 0;
  for(int i = 1; i <= n; ++i) {
    for(int j = 0; j <= l; ++j) {
      for(int k = 0; k <= j && t - k * v[i].ta >= 0; ++k) {
        sepoate[i][j] = max(sepoate[i][j], sepoate[i - 1][j - k] + bmax[i][k]);
      }
    }
  }
  return sepoate[n][l] >= l;
}
int cb(int st, int dr) {
  int last = 0;
  while(st <= dr) {
    int mij = (st + dr) / 2;
    if(vf(mij) == 1) {
      dr = mij - 1;
      last = mij;
    }
    else {
      st = mij + 1;
    }
  }
  return last;
}

int main() {
  freopen("lapte.in", "r", stdin);
  freopen("lapte.out", "w", stdout);
  scanf("%d%d", &n, &l);
  for(int i = 1; i <= n; ++i) {
    scanf("%d%d", &v[i].ta, &v[i].tb);
  }
  int timp = cb(1, 100);
  printf("%d\n", timp);
  vf(timp);
  int a = l;
  for(int i = n; i > 0; --i) {
    bool ok = 0;
    for(int j = 0; ok == 0 && j <= a && timp - j * v[i].ta >= 0; ++j) {
      if(sepoate[i - 1][a - j] + bmax[i][j] == sepoate[i][a]) {
        sol[i].a = j;
        sol[i].b = bmax[i][j];
        a -= j;
        ok = 1;
      }
    }
  }
  for(int i = 1; i <= n; ++i) {
    printf("%d %d\n", sol[i].a, sol[i].b);
  }
  return 0;
}