Cod sursa(job #155477)

Utilizator znakeuJurba Andrei znakeu Data 11 martie 2008 22:42:51
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <stdio.h>
#include <stdlib.h>
#define TMAX 100
struct milkdrinker
{
	int a,b,p,a2,b2;	
};

milkdrinker v[TMAX+1];

int cmp(const void *a, const void *b)
{
	milkdrinker x=*(milkdrinker*)a, y=*(milkdrinker*)b;
	return (x.a-x.b)-(y.a-y.b);	
}

int cmp2(const void *a, const void *b)
{
	milkdrinker x=*(milkdrinker*)a, y=*(milkdrinker*)b;
	return x.p-y.p;
}

int main()
{
	freopen("lapte.in","r",stdin);
	freopen("lapte.out","w",stdout);
	
	int i,s,e,a,b,t,tt,n,S,K=0;
	
	scanf("%d%d",&n,&S);
	
	for (i=0; i<n; i++)
	{
		scanf("%d%d",&v[i].a,&v[i].b);
		v[i].p=i;
	}
	qsort(v,n,sizeof(v[0]),cmp);
	
	s=1; e=TMAX;
	
	while (s!=e)
	{
		a=0; b=0;
		t=(s+e)/2; tt=0;
		i=0;
		while (a<S && i<n)
			a+=t/v[i++].a;
		i--;
		while (a>S)
		{
			a--;
			tt+=v[i].a;
		}
		b+=tt/v[i++].b;
		while (b<S && i<n)
			b+=t/v[i++].b;
		if (a>=S && b>=S)
			e=(s+e)/2;
		else
			s=(s+e)/2+1;		
	}
	
	printf("%d\n",s); a=0; b=0; K=0;
	for (i=0; i<n;i++)
	{
		if (K==0)
			if (a+s/v[i].a<S)
			{
				a+=s/v[i].a;
				v[i].a2=s/v[i].a;
				v[i].b2=0;
			}
			else
			{
				t=0;
				while (a<S)
				{
					a++;
					t++;				
				}
				v[i].a2=t;
				v[i].b2=(s-v[i].a*t)/v[i].b;
				K=1;
			}
		else
		{
			v[i].a2=0;
			v[i].b2=s/v[i].b;
		}		
	}
	
	qsort(v,n,sizeof(v[0]),cmp2);
	
	for (i=0; i<n; i++)
		printf("%d %d\n",v[i].a2,v[i].b2);
	
	fclose(stdout);
	fclose(stdin);	
	return 0;
}