Pagini recente » Cod sursa (job #2724608) | Cod sursa (job #570278) | Cod sursa (job #485155) | Cod sursa (job #254116) | Cod sursa (job #458)
Cod sursa(job #458)
//100p
#include <stdio.h>
#include <string.h>
#define INF 2000000001
#define VMAX 101*101
#define NMAX 256
int Ta[NMAX], Tb[NMAX];
int M[NMAX][NMAX], Lt[NMAX][NMAX];
int LA[NMAX], LB[NMAX];
int i, j, N, L, R, k;
int dinamiq(int T)
{
int i, j, k, V;
memset(Lt, 0, sizeof(Lt));
memset(M, 0, sizeof(M));
for (i = 0; i <= 2 * L + 1; i++)
for (j = 0; j <= 2 * L + 1; j++) M[i][j] = -INF;
M[0][0] = 0;
for (i = 0; i <= N - 1; i++)
{
for (j = 0; j <= L; j++)
for (k = 0; k <= L; k++)
if (M[i][j] != -INF && Ta[i + 1] * k <= T)
{
V = (T - (Ta[i + 1] * k) )/Tb[i + 1];
if (M[i + 1][j + k] < M[i][j] + V)
{
M[i + 1][j + k] = M[i][j] + V;
Lt[i + 1][j + k] = k;
}
}
V = -INF;
}
return M[N][L] >= L;
}
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", &Ta[i], &Tb[i]);
int l = 0;
int r = VMAX;
int c, rez;
while ( l <= r)
{
c = (l + r)/2;
rez = dinamiq(c);
if (rez)
{
R = c;
r = c - 1;
}
else l = c + 1;
}
printf("%d\n", R);
rez = dinamiq(R);
k = N;
j = L;
while (k > 0)
{
LA[k] = Lt[k][j];
LB[k] = (R - (Ta[k] * LA[k]) )/Tb[k];
j = j - Lt[k][j];
k--;
}
for (i = 1; i <= N; i++) printf("%d %d\n", LA[i], LB[i]);
fclose(stdin);
fclose(stdout);
return 0;
}