Cod sursa(job #184120)

Utilizator raduchilomRadu Chilom raduchilom Data 23 aprilie 2008 08:46:45
Problema Lapte Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include<fstream>
using namespace std;
fstream fin,fout;
int i,j,N,L,tmin,T, a[101], b[101], x[102][102], y[102][102], w;

int e_posibil(int t)
{
int i,j,k,v;
for (i=1;i<=N;i++)
	for (j=0;j<=L;j++)
		{x[i][j]=-1;y[i][j]=-1;}
for (j=0;j*a[N]<=t;j++)
   {x[N][j]=(t-j*a[N])/b[N];y[N][j]=j;}
for (i=N-1;i>=1;i--)
   for (j=0;j<=L;j++)
       if (x[i+1][j]>-1)
        {
	for (k=0;(k*a[i]<=t)&&(k+j<=L);k++)
            {
            v=(t-k*a[i])/b[i];
            if (v+x[i+1][j]>x[i][j+k])
               {x[i][j+k]=v+x[i+1][j]; y[i][j+k]=k;}
            }
   	if (x[i][L]>=L)return 1;
        }
if (x[1][L]>=L)return 1;
return 0;
}

void caut_binar_timpul_minim(int tl, int th, int &tp)
{
if (tl<=th)
{
int tm=(tl+th)/2;
if (e_posibil(tm)==1)
   {
   tp=tm;
   caut_binar_timpul_minim(tl,tm-1,tp);
   }
   else
       {
       caut_binar_timpul_minim(tm+1,th,tp);
       }
}
}

int main(void)
{
fin.open("lapte.in",ios::in);
fout.open("lapte.out",ios::out);
fin>>N>>L;
for (i=1;i<=N;i++)
  fin>>a[i]>>b[i];
tmin=L*a[N];
if (L*b[N]>tmin) tmin=L*b[N];
T=tmin;
caut_binar_timpul_minim(1,tmin,T);
w=e_posibil(T);
fout<<T<<endl;
j=L;
for (i=1;i<=N;i++)
  {
  fout<<y[i][j]<<" "<<(T-y[i][j]*a[i])/b[i]<<endl;
  j=j-y[i][j];
  }
fout.close();
fin.close();
return 0;
}