Pagini recente » Cod sursa (job #1951683) | Cod sursa (job #198170)
Cod sursa(job #198170)
#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]);
}