Cod sursa(job #2507256)

Utilizator popashtefan10Popa Stefan popashtefan10 Data 9 decembrie 2019 20:56:42
Problema Lapte Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <iostream>
#include <cstdio>

using namespace std;

int n, l;
int a[105], b[105];
int path1[105], path2[105];
int d[105][105]; /// d[i][j] - nr de litri de lapte A pe care pot sa il bea primii i oameni, dupa ce au baut j litri de lapte B
int pre[105][105]; /// pre[i][j] - coloana de pe linia i - 1 de pe care am actualizat d[i][j]

void init() {
  for(int i = 0; i <= l; i++)
    for(int j = 0; j <= l; j++)
      d[i][j] = -1000000000;
}

void gen_d(int t) {
  init();
  int val;

  d[0][0] = 0;
  for(int i = 1; i <= n; i++)
    for(int j = 0; j <= l; j++)
      for(int k = j; k >= 0 && (j - k) * b[i] <= t; k--) {
        val = d[i - 1][k] + (t - (j - k) * b[i]) / a[i];
        if(val > d[i][j]) {
          d[i][j] = val;
          pre[i][j] = k;
        }
      }
}

void gen_path() {
  int j = l;

  for(int i = n; i >= 1; i--) {
    path1[i] = d[i][j] - d[i - 1][pre[i][j]];
    path2[i] = j - pre[i][j];
    j = pre[i][j];
  }
}

int main() {
  freopen("lapte.in", "r", stdin);
  freopen("lapte.out", "w", stdout);
  int st, dr, t, last;

  scanf("%d %d", &n, &l);
  for(int i = 1; i <= n; i++)
    scanf("%d %d", &a[i], &b[i]);

  st = 1;
  dr = 100;
  while(st <= dr) {
    t = (st + dr) / 2;
    gen_d(t);
    if(d[n][l] >= l) {
      last = t;
      gen_path();
      dr = t - 1;
    }
    else
      st = t + 1;
  }

  printf("%d\n", last);
  for(int i = 1; i <= n; i++)
    printf("%d %d\n", path1[i], path2[i]);

  return 0;
}