Cod sursa(job #391925)

Utilizator ooctavTuchila Octavian ooctav Data 6 februarie 2010 15:18:01
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <cstdio>
#define NMAX 101
#define TMAX 101
int N,L;
struct timpi
{
	int a,b;
}e[NMAX];

void citire()
{
	scanf("%d %d",&N,&L);
	for(int i=1;i<=N;i++)
		scanf("%d %d",&e[i].a,&e[i].b);
}

void scrie(int T)
{
	int lung=0,i=1,lung2;
	
	while(lung<L)
	{
		lung2=lung;
		lung+=T/e[i++].a;
		if(lung>=L)
		{
				printf("%d %d\n",L-lung2,lung=(T-(L-lung2)*e[i-1].a)/e[i-1].b);
				break;
		}
		else	printf("%d %d\n",lung-lung2,0);
	}	
	
	while(lung<L && i<=N)
	{
		lung2=lung;
		lung+=T/e[i++].b;
		printf("%d %d\n",0,lung-lung2);
	}
}

void interclasare(int p,int m,int q)
{
	int i=p,j=m+1,k=0;
	timpi f[NMAX];
	
	while(i<=m && j<=q)
		if( (e[i].a<e[j].a) || (e[i].a==e[j].a && e[i].b>e[j].b) )
			f[++k]=e[i++];
		else
			f[++k]=e[j++];
	while(i<=m)
		f[++k]=e[i++];
	while(j<=q)
		f[++k]=e[j++];
	
	for(int l=1;l<=k;l++)
		e[p-1+l]=f[l];
}

void merge_sort(int p,int q)
{
	if(p<q)
	{
		int m=(p+q)/2;
		merge_sort(p,m);
		merge_sort(m+1,q);
		interclasare(p,m,q);
	}	
}

int ok(int x)
{
	int lung=0,i=1,lung2;
	
	while(lung<L && i<=N)
	{
		lung2=lung;
		lung+=x/e[i++].a;
	}
	
	if(lung>=L)	lung=(x-(L-lung2)*e[i-1].a)/e[i-1].b;
	else		return 0;
	
	while(lung<L && i<=N)
		lung+=x/e[i++].b;
	
	if(lung>=L)	return 1;
	return 0;
}

void cautare_bin()
{
	int T=0,p=1;
	while((p<<1)<=TMAX)
		p<<=1;
	while(p)
	{
		if(!ok(T+p))
			T+=p;
		p>>=1;
	}
	
	scrie(T+1);
}

int main()
{
	freopen("lapte.in","r",stdin);
	freopen("lapte.out","w",stdout);
	
	citire();
	merge_sort(1,N);
	cautare_bin();
	
	return 0;
}