Cod sursa(job #1696164)

Utilizator BrandonChris Luntraru Brandon Data 28 aprilie 2016 15:21:50
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>
#include <cstring>

using namespace std;

const int MaxN = 105;

ifstream cin ("lapte.in");
ofstream cout ("lapte.out");

int dp[MaxN][MaxN], QuantitTo[MaxN][MaxN], A[MaxN], B[MaxN], QuantitA[MaxN];
int n, L, Ans, MilkLeft;

bool Ok(int T) {
  memset(dp, -1, sizeof dp);
  memset(QuantitTo, 0, sizeof QuantitTo);

  dp[0][0] = 0;

  for (int i = 1; i <= n; ++i) {
    for (int j = 0; j <= L; ++j) {
      for (int k = 0; k <= j and k * A[i] <= T; ++k) {
        if (dp[i - 1][j - k] != -1) {
          int new_B = dp[i - 1][j - k] + (T - k * A[i]) / B[i];

          if (new_B > dp[i][j]) {
            dp[i][j] = new_B;
            QuantitTo[i][j] = k;
          }
        }
      }
    }
  }

  return dp[n][L] >= L;
}

inline int BinSearch(int l, int r) {
  int med, ans = -1;

  while (l <= r) {
    med = (l + r) / 2;

    if (Ok(med)) {
      r = med - 1;
      ans = med;
    }
    else {
      l = med + 1;
    }
  }

  return ans;
}

int main() {
  cin >> n >> L;

  for (int i = 1; i <= n; ++i) {
    cin >> A[i] >> B[i];
  }

  Ans = BinSearch(1, 101);

  cout << Ans << '\n';

  Ok(Ans);
  MilkLeft = L;

  for (int i = n; i >= 1; --i) {
    QuantitA[i] = QuantitTo[i][MilkLeft];
    MilkLeft -= QuantitA[i];
  }

  for(int i = 1; i <= n; ++i) {
    int QuantitB = (Ans - QuantitA[i] * A[i]) / B[i];
    cout << QuantitA[i] << ' ' << QuantitB << '\n';
  }

  return 0;
}