Pagini recente » Istoria paginii runda/agagahash | Istoria paginii utilizator/dumitru.ceara | Rating Plugaru Dan (Hannibal) | Cod sursa (job #1799156) | Cod sursa (job #343090)
Cod sursa(job #343090)
#include <cstdio>
#include <cstring>
#define file_in "lapte.in"
#define file_out "lapte.out"
#define Nmax 101
int N,L;
int ls,ld,mij,ok;
int i,j,l;
int A[Nmax],B[Nmax];
int M[Nmax][Nmax];
int S[Nmax][Nmax];
int Tmax;
int SA[Nmax],SB[Nmax];
int main()
{
freopen(file_in,"r",stdin);
freopen(file_out,"w",stdout);
scanf("%d %d", &N, &L);
for (i=0;i<N;++i)
scanf("%d %d", &A[i], &B[i]);
//dinamica O(N^3 log N)
ls=1;
ld=Nmax;
//cautare binara
while(ls<=ld)
{
mij=(ls+ld)>>1;
for (i=0;i<Nmax;++i)
for (j=0;j<Nmax;++j)
M[i][j]=-1,
S[i][j]=0;
for (i=0;i<Nmax;++i)
if (mij>=i*A[0])
M[0][i]=(mij-i*A[0])/B[0],
S[0][i]=i;//retine pozitia
for (i=1;i<N;++i)
for (j=0;j<Nmax;++j)
for (l=0;l<Nmax-j;++l)
if (mij>=A[i]*l && M[i-1][j]>=0 && (M[i-1][j]+(mij-l*A[i])/B[i]>M[i][j+l]))
M[i][j+l]=M[i-1][j]+(mij-l*A[i])/B[i],
S[i][j+l]=l;
ok=0;
for (i=L;i<Nmax && !ok;++i)
if (M[N-1][i]>=L)
ok=i;
if (ok)
{
Tmax=mij;
ld=mij-1;
for (i=N-1;i>=0;--i)
{
SA[i]=S[i][ok];
SB[i]=(Tmax-A[i]*SA[i])/B[i];
ok-=SA[i];
}
}
else
{
ls=mij+1;
}
}
printf("%d\n", Tmax);
for (i=0;i<N;++i)
printf("%d %d\n", SA[i], SB[i]);
fclose(stdin);
fclose(stdout);
return 0;
}