Cod sursa(job #483208)

Utilizator cosmyoPaunel Cosmin cosmyo Data 7 septembrie 2010 13:25:47
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include<fstream.h>
#define NMAX 120
long t,n,l,a[NMAX],b[NMAX],d[NMAX][NMAX],tc[NMAX][NMAX];
void cit()
{ifstream fin("lapte.in");
  fin>>n>>l;
	   for(long i=1;i<=n;++i)
		   fin>>a[i]>>b[i];
  fin.close();
}
long min(long a,long b)
{return a<b?a:b;}
bool check(long t)
{long i,j,k,val;
 memset(d,-1,sizeof(d)); 
 d[0][0]=0;
  for(i=1;i<=n;++i)
  { for(j=0;j<=l;++j)
     if(d[i-1][j]!=-1)
	   for(k=min(l-j,t/a[i]);k>=0;--k)
	   {val=(t-k*a[i])/b[i]+d[i-1][j];
	     if(val>d[i][j+k])
		  d[i][j+k]=val,tc[i][j+k]=j;
	   }
  }
 return d[n][l]>=l;
} 
ofstream fout("lapte.out");
long cauta(long p,long u)
{long t=(p+u)/2;
  if(p<=u)
  {if(check(t))
		return cauta(p,t-1);
  else
	 return cauta(t+1,u);
  }
  else
	  if(p>u)
		  return p;
}

void afis(long i,long j)
{long x,y,p;
 if(i!=0)
 {p=tc[i][j];
  y=d[i][j]-d[i-1][p];
  x=j-p;;
  afis(i-1,p);
  fout<<x<<" "<<y<<'\n';
 }
 else
	 fout<<t<<'\n';
}
int main()
{cit();
 t=cauta(1,100);
 check(t);
 afis(n,l);
 fout.close();
 return 0;
}