Cod sursa(job #343090)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 24 august 2009 23:09:49
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#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;
}