Cod sursa(job #732083)

Utilizator flaviu.stefanlupu flaviu flaviu.stefan Data 9 aprilie 2012 17:42:50
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<stdio.h>
#define N 105
long s,d,m,ok,tmin,i,l,x[N][N],ta[N],tb[N],n,j,y[N],k,ca[N][N],cb[N][N],
sa[N],sb[N];
void citire();
void dinamica();
void print_sol();
int main()
{       citire();
	s=0;d=101;
	while(d-s-1)
	{ m=(s+d)/2;
	  ok=0;
	  dinamica();
	  if(ok)d=m;
	  else s=m;
	}
	print_sol();
	return 0;
}
void dinamica()
{       long time;
	for(i=0;i<=l;i++)x[0][i]=-1;x[0][0]=0;
	for(i=1;i<=n;i++)
	{ for(j=0;j<=l;j++){y[j]=-1;x[i][j]=-1;}
	  for(j=0;j<=l;j++)
	  { time=m-j*ta[i];
	    if(time<0)break;
	    y[j]=time/tb[i];
	  }
	  for(j=0;j<=l;j++)
	   for(k=0;k<=j;k++)
	    { if(y[k]==-1)break;
	      if(x[i-1][j-k]==-1)continue;
	      if(x[i][j]<y[k]+x[i-1][j-k])
	       { x[i][j]=y[k]+x[i-1][j-k];
		 ca[i][j]=k;cb[i][j]=y[k];
	       }
	    }
	  if(x[i][l]>=l)
	  {  ok=1;tmin=m;
	     for(j=i+1;j<=n;j++){ sa[j]=0;sb[j]=0;}
	     sa[i]=ca[i][l];sb[i]=cb[i][l];k=l;
	     for(j=i-1;j>=1;j--)
	     { k-=sa[j+1];sa[j]=ca[j][k];sb[j]=cb[j][k];}
	     return;
	  }
	}
}

void citire()
{
	freopen("lapte.in","rt",stdin);
	scanf("%ld%ld",&n,&l);
	for(i=1;i<=n;i++) scanf("%ld%ld",&ta[i],&tb[i]);
	tmin=101;
}
void print_sol()
{
	freopen("lapte.out","wt",stdout);
	printf("%ld\n",tmin);
	for(i=1;i<=n;i++)printf("%ld %ld\n",sa[i],sb[i]);
}