Cod sursa(job #2505040)

Utilizator popashtefan10Popa Stefan popashtefan10 Data 6 decembrie 2019 08:01:10
Problema Lapte Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <iostream>
#include <cstdio>

using namespace std;

int n, l;
int la[105], lb[105], a[105], b[105];
int d[105][105][105]; /// d[k][i][j] = timpul minim pt a consuma i litri de tip a si j litri de tip b folosind primele k persoane

int bs(int k, int lin, int col, int coef, int add) {
  int st = 0, dr = col, last = max(d[k][lin][col], add), mij, val;

  while(st <= dr) {
    mij = (st + dr) / 2;
    val = add + (col - mij) * coef;
    last = min(last, max(d[k][lin][mij], val));
    if(d[k][lin][mij] < val)
      st = mij + 1;
    else
      dr = mij - 1;
  }
  return last;
}

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

  scanf("%d %d", &n, &l);
  for(int k = 1; k <= n; k++) {
    scanf("%d %d", &a[k], &b[k]);
    if(k == 1) {
      for(int i = 0; i <= l; i++)
        for(int j = 0; j <= l; j++)
          d[k][i][j] = i * a[k] + j * b[k];
    }
    else {
      for(int i = l; i >= 0; i--)
        for(int j = l; j >= 0; j--) {/// calculam d[k][i][j]
          d[k][i][j] = d[k - 1][i][j];
          for(int lin = i; lin >= 0 && (i - lin) * a[k] <= d[k - 1][lin][j]; lin--)
            d[k][i][j] = min(d[k][i][j], bs(k - 1, lin, j, b[k], (i - lin) * a[k]));
        }
    }
  }
  printf("%d\n", d[n][l][l]);

//  for(int i = 1; i <= n; i++) {
//    printf("pers %d:\n", i);
//    for(int j = 0; j <= l; j++) {
//      for(int k = 0; k <= l; k++)
//        printf("%d ", d[i][j][k]);
//      printf("\n");
//    }
//  }

  int lin = l, col = l, val = 0;
  for(int k = n; k >= 2; k--)
    for(int i = lin; i >= 0; i--)
      for(int j = col; j >= 0; j--) {
        val = (lin - i) * a[k] + (col - j) * b[k];
        if(max(d[k - 1][i][j], val) == d[k][lin][col]) {
          la[k] = lin - i;
          lb[k] = col - j;
          lin = i;
          col = j;
          i = -1;
          j = -1;
        }
      }
  la[1] = lin;
  lb[1] = col;
  for(int i = 1; i <= n; i++)
    printf("%d %d\n", la[i], lb[i]);

  return 0;
}