Cod sursa(job #198225)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 9 iulie 2008 18:58:29
Problema Lapte Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include<stdio.h>
long n,l,i,tmin,ta[101],ca[101],sa[101],tb[101],cb[101],sb[101],s,d,m,ok;
void citire();
void back(long T,long A,long B,long I);
void print_sol();
int main()
{       citire();
	s=0;d=101;
	while(d-s-1)
	{ m=(s+d)/2;
	  ok=0;
	  back(0,l,l,1);
	  if(ok)d=m;
	  else s=m;
	}
	tmin=d;
	print_sol();
	return 0;
}
void back(long T,long A,long B,long I)
{
	long a,b,time;
	if(!A&&!B)
	{ if(T<=m)
	  { for(i=1;i<I;i++){sa[i]=ca[i];sb[i]=cb[i];}
	    for(i=I;i<=n;i++){sa[i]=0;sb[i]=0;}
	    ok=1;
	  }
	  return;
	}
	if(I==n+1)return;
	for(a=0;a<=A;a++)
	 for(b=0;b<=B;b++)
	   { time=a*ta[I]+b*tb[I];
	     if(time>m)break;
	     time=(time>T)?time:T;
	     ca[I]=a;cb[I]=b;
	     back(time,A-a,B-b,I+1);
	     if(ok)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]);
}