Cod sursa(job #2532290)

Utilizator AlexNeaguAlexandru AlexNeagu Data 27 ianuarie 2020 18:02:00
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
ifstream in("lapte.in");
ofstream out("lapte.out");
int a[N], b[N], dp[N][N], from[N][N];
// dp[i][j] --> cantitatea de lapte b, luand cel putin j litri din laptele A, baute de i oameni
int n, l;
bool check(int time) {
  for (int i = 0; i <= n; i++) {
    for (int j = 0; j <= l; j++) {
      dp[i][j] = -1e9;
    }
  }
  dp[0][0] = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j <= l; j++) {
      for (int k = 0; k * a[i] <= time && k <= j; k++) {
        if (dp[i][j] < dp[i - 1][j - k] + (time - a[i] * k) / b[i]) {
          from[i][j] = j - k;
          dp[i][j] = max(dp[i][j], dp[i - 1][j - k] + (time - a[i] * k) / b[i]);
        }
      }
    }
  }
  if (dp[n][l] >= l) {
    return true;
  }
  return false;
}
int main() {
  in >> n >> l;
  for (int i = 1; i <= n; i++) {
    in >> a[i] >> b[i];
  }
  int st = 0, dr = 105, ans = 0;
  while(st <= dr) {
    int mid = (st + dr) / 2;
    if (check(mid)) {
      ans = mid;
      dr = mid - 1;
    }
    else {
      st = mid + 1;
    }
  }
  check(ans);
  vector < pair < int, int > > rs(N);
  int x = n, length = 0;
  while(x) {
    rs[++length].first = l - from[x][l];
    rs[length].second = dp[x][l] - dp[x - 1][from[x][l]];
    l = from[x][l];
    x--;
  }
  out << ans << "\n";
  for (int i = length; i >= 1; i--) {
    out << rs[i].first << " " << rs[i].second << "\n";
  }
  return 0;
}