Cod sursa(job #198170)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 9 iulie 2008 09:53:51
Problema Lapte Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<stdio.h>
long ta[101],tb[101],l,i,n,s,d,m,ca[101],cb[101],
sa[101],sb[101],ra[101],rb[101],gata,tsol;
void back(long poz);
void retsol();
void print_sol();
int main()
{
	freopen("lapte.in","rt",stdin);
	freopen("lapte.out","wt",stdout);
	scanf("%ld%ld",&n,&l);
	for(i=1;i<=n;i++) scanf("%ld%ld",&ta[i],&tb[i]);
	s=0;d=101;
	while(d-s-1)
	{ m=(s+d)/2;
	  for(i=1;i<=n;i++){ca[i]=0;cb[i]=0;ra[i]=0;rb[i]=0;}
	  ra[0]=l;rb[0]=l;
	  back(1);
	  if(gata){retsol();gata=0;d=m;}
	  else s=m;
	}
	print_sol();
	return 0;
}
void back(long poz)
{   long rest=0;
    if(ra[poz-1]<=0&&rb[poz-1]<=0){gata=1;return;}
    if(poz==n+1)return;
    if(ra[poz-1]<=0)
    { cb[poz]=m/tb[poz];rb[poz]=rb[poz-1]-cb[poz];back(poz+1);
      if(!gata)cb[poz]=0;return;}
    if(rb[poz-1]<=0)
    { ca[poz]=m/ta[poz];ra[poz]=ra[poz-1]-ca[poz];back(poz+1);
      if(!gata)ca[poz]=0;return;}
    ca[poz]=m/ta[poz];
    rest=m-ta[poz]*ca[poz];
    cb[poz]=rest/tb[poz];
    while(ca[poz]>=0)
    { ra[poz]=ra[poz-1]-ca[poz];
      rb[poz]=rb[poz-1]-cb[poz];
      back(poz+1);
      if(gata)return;
      ca[poz]--;
      rest=m-ta[poz]*ca[poz];
      cb[poz]=rest/tb[poz];
    }
    ca[poz]=0;cb[poz]=0;
}
void retsol()
{
	tsol=m;
	for(i=1;i<=n;i++){sa[i]=ca[i];sb[i]=cb[i];}
}
void print_sol()
{
	printf("%ld\n",tsol);
	for(i=1;i<=n;i++) printf("%ld %ld\n",sa[i],sb[i]);
}