Cod sursa(job #380127)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 4 ianuarie 2010 21:10:21
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#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;
}