Cod sursa(job #337081)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 2 august 2009 14:47:49
Problema Garaj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<stdio.h>
struct vect
{
	int t,x;
};
int n,x,nr,tc;
vect min;
vect v[100002];

void read()
{
	freopen("garaj.in","r",stdin);
	freopen("garaj.out","w",stdout);
	scanf("%d%d",&n,&x);
	int i;
	min.t=1000000000;
	for(i=1;i<=n;i++)
	{
		scanf("%d%d",&v[i].x,&v[i].t);
		v[i].t*=2;
		if(v[i].t<min.t)
		{
			min.t=v[i].t;
			min.x=v[i].x;
		}
	}
}

int part(int st, int dr)
{
	int i,j,m;
	vect p,aux;
	m=(st+dr)>>1;
	p=v[m];
	i=st-1;
	j=dr+1;
	while(1)
	{
		do{++i;}while(v[i].x*(int)(tc/v[i].t)>p.x*(int)(tc/p.t));
		do{--j;}while(v[j].x*(int)(tc/v[j].t)<p.x*(int)(tc/p.t));
		if(i<j)
		{
			aux=v[i];
			v[i]=v[j];
			v[j]=aux;
		}
		else
			return j;
	}
}

void quick(int st, int dr)
{
	int p;
	if(st<dr)
	{
		p=part(st,dr);
		quick(st,p);
		quick(p+1,dr);
	}
}

int exista(int t)
{
	int i=1;
	long long cx=x;
	while(cx>0)
	{
		if(i==n+1)
			break;
		if(v[i].t>t)
		{
			i++;
			continue;
		}
		cx=cx-v[i].x*(long long)(t/v[i].t);
		i++;
	}
	return cx<=0;
}

void rez()
{
	int st=min.t,dr,m,cm;
	if(x/min.x)
		dr=(int)(x/min.x)*min.t;
	else
		dr=min.t;
	while(st!=dr)
	{
		m=(st+dr)>>1;
		if(exista(m))
		{
			cm=m;
			dr=m;
		}
		else
			st=m+1;
	}
	while(exista(st)==0)
		st++;
	while(exista(st))
	{
		cm=st;
		st--;
	}
	tc=cm;
	quick(1,n);
	int i;
	for(i=1;i<=n;i++)
	{
		if(x<=0)
			break;
		if(v[i].t<=tc)
		{
			x=x-v[i].x*(int)(tc/v[i].t);
			nr++;
		}
	}
	printf("%d %d\n",tc,nr);
}

int main()
{
	read();
	rez();
	return 0;
}