Pagini recente » Cod sursa (job #416729) | Cod sursa (job #1270533) | Cod sursa (job #2141318) | Cod sursa (job #194747) | Cod sursa (job #2098948)
#include <cstdio>
const int MAXN = 1e2;
#define CB (1 << 17)
int d[MAXN + 1][MAXN + 1], p[MAXN + 1][MAXN + 1],
a[MAXN + 1], b[MAXN + 1];
int fn(int t, int n, int l) {
for (int i = 0; i <= n; ++i) {
for (int j = 0; j <= l; ++j) {
d[i][j] = -1;
}
}
d[0][0] = 0;
for (int i = 1; i <= n; ++i) {
for (int j = 0; j <= l; ++j) {
for (int k = 0; k <= j; ++k) {
if (d[i - 1][k] != -1 && (j - k) * a[i] <= t &&
d[i][j] < d[i - 1][k] + (t - (j - k) * a[i]) / b[i]) {
d[i][j] = d[i - 1][k] + (t - (j - k) * a[i]) / b[i];
p[i][j] = k;
}
}
}
}
return d[n][l];
}
int main() {
int n, l, i, t;
FILE *f = fopen("lapte.in", "r");
fscanf(f, "%d%d", &n, &l);
for (int i = 1; i <= n; ++i) {
fscanf(f, "%d%d", &a[i], &b[i]);
}
fclose(f);
for (i = 1; (i << 1) <= CB; i <<= 1);
for (t = i + 1; i > 0; i >>= 1) {
if (t - i >= 1 && fn(t - i, n, l) >= l) {
t -= i;
}
}
for (int i = n; i > 0; --i) {
a[i] = l - p[i][l];
b[i] = d[i][l] - d[i - 1][p[i][l]];
l = p[i][l];
}
f = fopen("lapte.out", "w");
fprintf(f, "%d\n", t);
for (int i = 1; i <= n; ++i) {
fprintf(f, "%d %d\n", a[i], b[i]);
}
fclose(f);
return 0;
}