Pagini recente » Cod sursa (job #177461) | Cod sursa (job #266084) | Cod sursa (job #404216) | Cod sursa (job #2003229) | Cod sursa (job #385549)
Cod sursa(job #385549)
#include <cstdio>
#include <algorithm>
using namespace std;
#define Nmax 102
#define INF 1 << 30
struct lapte {int a, b;} v[Nmax], Sol[Nmax];
int n, L, sol, i;
int a[Nmax][Nmax], D[Nmax][Nmax];
int verifica (int T) {
int i, j, l, b;
for (i = 1; i <= n; i++)
memset (a[i], 0, sizeof (a[i]));
for (i = 1; i <= L; i++)
a[0][i] = -INF;
for (i = 1; i <= n; i++)
for (j = 0; j <= L; j++)
for (l = 0; l <= j; l++) {
b = a[i-1][j - l];
if ( l * v[i].a <= T )
b+= (T - (l * v[i].a)) / v[i].b;
else
b = 0;
if (a[i][j] < b) {
a[i][j] = b;
D[i][j] = l;
}
}
if (a[n][L] >= L) return 1;
return 0;
}
void cauta () {
int p = 1, u = v[1].a * L + v[1].b * L, mij;
while (p <= u) {
mij = (p + u) >> 1;
if ( verifica (mij) ) {
sol = mij;
u = mij - 1;
}
else
p = mij + 1;
}
}
void drum (int i, int j) {
if (!i) return ;
Sol[i].a = D[i][j];
Sol[i].b = (sol - (D[i][j] * v[i].a)) / v[i].b;
drum (i-1, j - D[i][j]);
}
int main () {
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);
cauta ();
printf ("%d\n", sol);
drum (n, L);
for (i = 1; i <= n; i++)
printf ("%d %d\n", Sol[i].a, Sol[i].b);
return 0;
}