Pagini recente » Cod sursa (job #626607) | Cod sursa (job #710490) | Cod sursa (job #194758) | Cod sursa (job #1664999) | Cod sursa (job #380127)
Cod sursa(job #380127)
#include <stdio.h>
#include <algorithm>
#include <string.h>
#define NMAX 101
using namespace std;
struct lapte
{
int a,b,poz;
};
lapte v[NMAX];
int n,l,rez_f,A[NMAX],B[NMAX];
lapte sol[NMAX];
void read()
{
scanf("%d%d",&n,&l);
int i;
for (i=1; i<=n; i++)
{
scanf("%d%d",&v[i].a,&v[i].b);
v[i].poz=i;
}
}
inline int min(int a,int b)
{
return a<b ? a : b;
}
inline int ok(int x)
{
memset(A,0,sizeof(A));
memset(B,0,sizeof(B));
int i,sum=0,sum2=0,val;
for (i=1; i<=n; i++)
if (sum<l)
{
val=min(x/v[i].a,l-sum);
sum+=val;
A[i]=val;
sum2+=(x-v[i].a*val)/v[i].b;
B[i]=(x-v[i].a*val)/v[i].b;
}
else
{
val=x/v[i].b;
sum2+=val;
B[i]=val;
sum+=(x-val*v[i].b)/v[i].a;
}
if (sum>=l && sum2>=l)
return 1;
return 0;
}
int cbin()
{
int i=0,step=(1<<15);
for (i=0; step; step>>=1)
if (!ok(i+step))
i+=step;
return ++i;
}
bool comp(lapte x,lapte y)
{
if (x.a-x.b<y.a-y.b)
return 1;
return 0;
}
void reconst()
{
int i;
for (i=1; i<=n; i++)
{
sol[v[i].poz].a+=A[i];
sol[v[i].poz].b+=B[i];
}
for (i=1; i<=n; i++)
printf("%d %d\n",sol[i].a,sol[i].b);
}
int main()
{
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
read();
sort(v+1,v+n+1,comp);
rez_f=cbin();
printf("%d\n",rez_f);
if (ok(rez_f))
reconst();
return 0;
}