Cod sursa(job #2177191)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 18 martie 2018 13:23:14
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <stdio.h>
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define ld long double
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define pll pair<ll, ll>
#define pdd pair<ld, ld>
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second

const int kMaxN = 100;

int n, min_milk;
int a[kMaxN + 5];
int b[kMaxN + 5];

int ans;
int dp[kMaxN + 5][2 * kMaxN + 5];
pair<pii, pii> how[kMaxN + 5][2 * kMaxN + 5];

bool Check(int t) {
  memset(dp, -1, sizeof(dp));
  dp[0][0] = 0;
  for (int i = 1; i <= n; i++) {
    for (int how_much_milk_a = 0; a[i] * how_much_milk_a <= t; how_much_milk_a++) {
      int rem_time = t - a[i] * how_much_milk_a;
      int how_much_milk_b = rem_time / b[i];
      for (int k = how_much_milk_a; k <= 2 * kMaxN; k++) {
        if (dp[i - 1][k - how_much_milk_a] != -1) {
          if (dp[i - 1][k - how_much_milk_a] + how_much_milk_b > dp[i][k]) {
            dp[i][k] = dp[i - 1][k - how_much_milk_a] + how_much_milk_b;
            how[i][k] = {{i - 1, k - how_much_milk_a}, {how_much_milk_a, how_much_milk_b}};
          }
        }
      }
    }
  }

  for (int i = min_milk; i <= 2 * kMaxN; i++) {
    if (dp[n][i] >= min_milk) {
      return 1;
    }
  }
  return 0;
}

ofstream fout("lapte.out");
void Print(int i, int j) {
  if (i == 0) {
    fout << ans << '\n';
    return;
  }
  Print(how[i][j].fi.fi, how[i][j].fi.se);
  fout << how[i][j].se.fi << " " << how[i][j].se.se << '\n';
}

int main() {
  cin.sync_with_stdio(false);

  ifstream cin("lapte.in");

  cin >> n >> min_milk;
  for (int i = 1; i <= n; i++) {
    cin >> a[i] >> b[i];
  }

  int l = 1;
  int r = kMaxN;
  ans = r;
  while (l <= r) {
    int mi = (l + r) / 2;
    if (Check(mi)) {
      ans = mi;
      r = mi - 1;
    } else {
      l = mi + 1;
    }
  }

  Check(ans);
  for (int i = min_milk; i <= 2 * kMaxN; i++) {
    if (dp[n][i] >= min_milk) {
      Print(n, i);
      return 0;
    }
  }

  return 0;
}