Cod sursa(job #2363687)

Utilizator ApostolIlieDanielApostol Daniel ApostolIlieDaniel Data 3 martie 2019 15:07:50
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <bits/stdc++.h>

using namespace std;

struct ura {
  int a;
  int b;
};
const int MAXN = 100;
ura v[MAXN + 1], rez[MAXN + 1];
int dp[MAXN + 1][MAXN + 1];
int last[MAXN + 1][MAXN + 1];
int l, n;
bool check (int t) {
  int i, j, k;
  for (i = 1; i <= n; i++)
    for (j = 0; j <= l; j++)
      dp[i][j] = -1;
  memset (last, 0, sizeof (last));
  for (i = 0; i <= l && i * v[1].a <= t; i++)
    dp[1][i] = (t - i * v[1].a) / v[1].b;
  for (i = 2; i <= n; i++) {
    for (j = 0; j <= l; j++) {
      for (k = 0; k <= j; k++) {
        if ((j - k) * v[i].a <= t) {
          if (dp[i - 1][k] >= 0 && dp[i][j] < dp[i - 1][k] + (t - (j - k) * v[i].a) / v[i].b) {
            dp[i][j] = dp[i - 1][k] + (t - (j - k) * v[i].a) / v[i].b;
            last[i][j] = k;
          }
        }
      }
    }
  }
  return (dp[n][l] >= l);
}
int main() {
  int st, dr, sol, k, i;
  freopen ("lapte.in", "r", stdin);
  freopen ("lapte.out", "w", stdout);
  scanf ("%d%d", &n, &l);
  for (i = 1; i <= n; i++)
    scanf ("%d%d", &v[i].a, &v[i].b);
  st = 1;
  dr = 100;
  while (st <= dr) {
    int mij = (st + dr) / 2;
    if (check (mij) == true) {
      sol = mij;
      dr = mij - 1;
    }
    else
      st = mij + 1;
  }
  printf ("%d\n", sol);
  check (sol);
  k = l;
  for (i = n; i > 0; i--) {
    rez[i].b = dp[i][k] - dp[i - 1][last[i][k]];
    rez[i].a = k - last[i][k];
    k = last[i][k];
  }
  for (i = 1; i <= n; i++)
    printf ("%d %d\n", rez[i].a, rez[i].b);
  return 0;
}