Cod sursa(job #381542)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 10 ianuarie 2010 21:17:42
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<fstream>
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int v[202][202],viz[202][202],u,p,i,j,t,n,l,a[202][3],tmin,b[202][202],k,c[202][202],maxim,w,z;
int main(){
f>>n>>l;
for(i=1;i<=n;i++){
	f>>a[i][1];
	f>>a[i][2];
if(a[i][1]>maxim)
maxim=a[i][1];}
p=1;
u=10001;

while(p<=u){
	t=(p+u)/2;
	//dinamica
	//init v
	for(i=1;i<=n;i++)
	 for(j=0;j<=l;j++)
		 v[i][j]=-1;
	
	for(i=0;i<=l+maxim;i++) 		   //constr prima linie
		if(t-(i*a[1][1])>=0) 		   //daca poate bea lapte A
	 v[1][i]=(t-(i*a[1][1]))/a[1][2];  // v[1][i]=lapte B baut dupa ce bea i litrii lapte A in t
		else v[1][i]=-1; 			   //nu mai poate sa bea lapte A
		 
	for(i=2;i<=n;i++){ //pargurgem copiii
		v[i][0]=t/a[i][2]+v[i-1][0];
		for(j=1;j<=l;j++)
			for(k=0;k<=j;k++)
			{ if(v[i-1][k]>=0&& (t-(j-k)*a[i][1])>=0&& v[i-1][k]+ (t-(j-k)*a[i][1])/a[i][2] >v[i][j] )
                      {    v[i][j]=	v[i-1][k]+ (t-(j-k)*a[i][1])/a[i][2];			
							  viz[i][j]=k;
							//z=k;
					  }
			}
	}
	if(v[n][l]>=l)
	{ tmin=t;
	  u=t-1;
	  memcpy(b,viz,sizeof(viz));
	  memcpy(c,v,sizeof(v));
	 // w=z;
	  
	}
	else p=t+1;
}
g<<tmin<<'\n';

p=l;
t=n;
while(n!=1)
{ u=b[n][p];
  a[n][1]=p-u;
  a[n][2]=c[n][p]-c[n-1][u];
  n--;
p=u;
}
g<<u<<' '<<c[1][u]<<'\n';
for(i=2;i<=t;i++)
	g<<a[i][1]<<' '<<a[i][2]<<'\n';
return 0;
}