Cod sursa(job #186484)

Utilizator alexeiIacob Radu alexei Data 28 aprilie 2008 01:04:27
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include<stdio.h>
#define nmax 105
int a[nmax],b[nmax];
int sola[nmax][nmax],solb[nmax][nmax];
int sfa[nmax],sfb[nmax];

inline int max(const int a,const int b)
{
       if(a>b)
       return a;
       return b;
}

int main()
{
 freopen("lapte.in","r",stdin);
 freopen("lapte.out","w",stdout);
 
 int n,l;
 scanf("%d %d",&n,&l);
 
int aux1=-1,aux2=-1,solfin=0,i,j,k; 
 
 for(i=0; i<n; ++i){   
 scanf("%d%d",&a[i],&b[i]);   
 aux1=max(aux1,a[i]);
 aux2=max(aux2,b[i]);
}
 int LEVEL=max(aux1,aux2)*l;
 int start=0,end=LEVEL;
 int tmin,bine;
 
 while( start<=end )
 {
        tmin=(start+end)/2;
        
        for(i=0; i<nmax; ++i)
         for(j=0; j<nmax; ++j){
         sola[i][j]=0;
         solb[i][j]=-1;
         }
 
        for(i=0; i<nmax; ++i)
        if( tmin>=i*a[0] )
        {
        solb[0][i]=(tmin-i*a[0])/b[0];
        sola[0][i]=i;
        }
        
        for(i=1; i<n; ++i)
         for(j=0; j<nmax; ++j)
          for(k=0; k<nmax-j; ++k)
                   if( k*a[i]<=tmin ){
                        aux1=solb[i-1][j]+(tmin-k*a[i])/b[i];
                        if( aux1>=solb[i][j+k] && solb[i-1][j]!=-1 )
                         {
                         solb[i][j+k]=aux1;
                         sola[i][j+k]=k;
                         }
                   }
       
       bine=0;
    
       for(i=l; i<=nmax; ++i)
        if(solb[n-1][i]>=l ){
        bine=i; break;} 
    
    if( bine )
    {
         end=tmin-1;
         solfin=tmin;
         
         for(i=n-1; i>=0; --i)
         {
         //printf("(%d)\n",bine);
         aux1=sola[i][bine];
         sfa[i]=aux1;
         sfb[i]=(tmin-aux1*a[i])/b[i];
         bine-=aux1;
         }
    }
    else
    {
        start=tmin+1;
    }
   // printf("\n\n");
}  
//solutie pare corecta desi nu prea corespunde cu exepmlul :D
printf("%d \n",solfin);

for(i=0; i<n; ++i)
printf("%d %d\n",sfa[i],sfb[i]);
    
    return 0;
}