Cod sursa(job #198244)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 9 iulie 2008 20:51:36
Problema Lapte Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 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 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(l,l,1);
	  if(ok)d=m;
	  else s=m;
	}
	tmin=d;
	print_sol();
	return 0;
}
void back(long A,long B,long I)
{       long b;
	if(!A&&!B)
	{ 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;
	if(!A)
	{ cb[I]=(m/tb[I]<B)?m/tb[I]:B;
	  back(A,B-cb[I],I+1);return;
	}
	if(!B)
	{ ca[I]=(m/ta[I]<A)?m/ta[I]:A;
	  back(A-ca[I],B,I+1);return;
	}
	ca[I]=(m/ta[I]<A)?m/ta[I]:A;
	cb[I]=(m-ta[I]*ca[I])/tb[I];
	cb[I]=(cb[I]<B)?cb[I]:B;
	while(ca[I]>=0)
	{
		back(A-ca[I],B-cb[I],I+1);
		if(ok)return;
		if(cb[I]==B)return;
		b=cb[I];
		do
		{ ca[I]--;
		  cb[I]=(m-ta[I]*ca[I])/tb[I];
		  cb[I]=(cb[I]<B)?cb[I]:B;
		}while(cb[I]==b&&ca[I]>=0);
		if(cb[I]==b)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]);
}