Pagini recente » Cod sursa (job #2373701) | Borderou de evaluare (job #2012397) | Cod sursa (job #2521659) | Borderou de evaluare (job #3202912) | Cod sursa (job #568109)
Cod sursa(job #568109)
#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)
{
register 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;
}