Pagini recente » Cod sursa (job #2393518) | Cod sursa (job #1081914) | Cod sursa (job #1418138) | Cod sursa (job #3145158) | Cod sursa (job #495020)
Cod sursa(job #495020)
#include <stdio.h>
int l,n,a[101],b[101],ind[101],sol,s[2][101];
int g(int x)
{
int la=0,lb=0,ok=1;
int i,j=0;
for (i=1;i<=n;++i) la+=x/a[i];
if (la<=l) return 0;
i=0;
while ((lb<l)&&(la>l)&&(i<=n))
{
++i;
la-=x/a[i];
lb+=x/b[i];
}
if ((la>=l)&&(lb>=l)) return 1;
if (lb>l)
{
lb-=x/b[i];
while ((ok)&&(j<=x))
{
++j;
la+=j/a[i];
lb+=(x-j)/b[i];
if (la>=l) ok=0;
else {la-=j/a[i];lb-=(x-j)/b[i];}
}
if ((la>=l)&&(lb>=l)) return 1;
}
return 0;
}
int bs(int s,int d)
{
int mid;
while (s<d)
{
mid=(s+d)/2;
if (g(mid)<1) s=mid+1;
else d=mid;
}
mid=(s+d)/2;
if (g(mid)<1) ++mid;
return mid;
}
void inter(int j)
{
int aux=a[j];a[j]=a[j-1];a[j-1]=aux;
aux=b[j];b[j]=b[j-1];b[j-1]=aux;
aux=ind[j];ind[j]=ind[j-1];ind[j-1]=aux;
}
int main()
{
int i,j=0,k,la=0,lb=0,ok=1;
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
scanf("%d%d",&n,&l);
for (i=1;i<=n;++i) ind[i]=i;
for (i=1;i<=n;++i) scanf("%d%d",&a[i],&b[i]);
for (i=2;i<=n;++i)
for (j=i;j>1;--j)
if (b[j]+a[j-1]<b[j-1]+a[j]) inter(j);
else if ((b[j]+a[j-1]==b[j-1]+a[j])&&(b[j]*a[j-1]<b[j-1]*a[j])) inter(j);
sol=bs(1,100);
printf("%d\n",sol);
for (i=1;i<=n;++i) la+=sol/a[i];
i=0;
while ((lb<l)&&(la>l)&&(i<=n))
{
++i;
la-=sol/a[i];
lb+=sol/b[i];
}
if ((la>=l)&&(lb>=l))
{
for (j=1;j<=i;++j) {s[0][ind[j]]=0;s[1][ind[j]]=sol/b[j];}
for (j=i+1;j<=n;++j) {s[0][ind[j]]=sol/a[j];s[1][ind[j]]=0;}
for (i=1;i<=n;++i) printf("%d %d\n",s[0][i],s[1][i]);
return 0;
}
lb-=sol/b[i];
while ((ok)&&(j<=sol))
{
++j;
la+=j/a[i];
lb+=(sol-j)/b[i];
if (la>=l) ok=0;
else {la-=j/a[i];lb-=(sol-j)/b[i];}
}
k=j;
for (j=1;j<i;++j) {s[0][ind[j]]=0;s[1][ind[j]]=sol/b[j];}
s[0][ind[i]]=k/a[i];s[1][ind[i]]=(sol-k)/b[i];
for (j=i+1;j<=n;++j) {s[0][ind[j]]=sol/a[j];s[1][ind[j]]=0;}
for (i=1;i<=n;++i) printf("%d %d\n",s[0][i],s[1][i]);
return 0;
}