Pagini recente » Cod sursa (job #1960725) | Cod sursa (job #2047379) | Cod sursa (job #2306449) | Cod sursa (job #914485) | Cod sursa (job #2164247)
#include <cstdio>
#include <algorithm>
#include <cstring>
const int MAX_N = 100;
const int MAX_L = 100;
int a[1 + MAX_N];
int b[1 + MAX_N];
int d[1 + MAX_N][1 + MAX_L];
int x[1 + MAX_N];
int y[1 + MAX_N];
int main() {
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
int n, l;
scanf("%d%d", &n, &l);
for (int i = 1; i <= n; i++) {
scanf("%d%d", &a[i], &b[i]);
}
int left = 1;
int right = 100;
int ans = -1;
while (left <= right) {
int t = (left + right) >> 1;
memset(d, 0, sizeof(d));
for (int A = 0; A * a[1] <= t; A++) {
d[1][A] = (t - A * a[1]) / b[1];
}
int lim = 0;
for (int i = 1; i <= n; i++) {
lim += t / a[i];
}
for (int i = 2; i <= n; i++) {
for (int A = 0; A <= lim; A++) {
for (int _A = 0; _A <= A; _A++) {
if (a[i] * (A - _A) <= t)
d[i][A] = std::max(d[i][A], (t - a[i] * (A - _A) + b[i] * d[i - 1][_A]) / b[i]);
}
}
}
bool sePoate = false;
for (int i = l; i <= lim && !sePoate; i++) {
if (d[n][i] >= l) {
sePoate = true;
}
}
if (sePoate) {
right = t - 1;
ans = t;
} else {
left = t + 1;
}
}
printf("%d\n", ans);
int t = ans;
memset(d, 0, sizeof(d));
for (int A = 0; A * a[1] <= t; A++) {
d[1][A] = (t - A * a[1]) / b[1];
}
int lim = 0;
for (int i = 1; i <= n; i++) {
lim += t / a[i];
}
for (int i = 2; i <= n; i++) {
for (int A = 0; A <= lim; A++) {
for (int _A = 0; _A <= A; _A++) {
if (a[i] * (A - _A) <= t)
d[i][A] = std::max(d[i][A], (t - a[i] * (A - _A) + b[i] * d[i - 1][_A]) / b[i]);
}
}
}
int last = 0;
for (int i = l; i <= lim; i++) {
if (d[n][i] >= l) {
last = i;
}
}
for (int i = n; i >= 1; i--) {
int A = last;
for (int _A = 0; _A <= A; _A++) {
if (a[i] * (A - _A) <= t && d[i][A] == (t - a[i] * (A - _A) + b[i] * d[i - 1][_A]) / b[i]) {
x[i] = A - _A;
y[i] = d[i][A] - d[i - 1][_A];
last = _A;
}
}
}
for (int i = 1; i <= n; i++) {
printf("%d %d\n", x[i], y[i]);
}
return 0;
}