Cod sursa(job #142501)

Utilizator megabyteBarsan Paul megabyte Data 24 februarie 2008 18:00:15
Problema Garaj Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <cstdio>
#define INF "garaj.in"
#define OUF "garaj.out"
using namespace std;
const int NMAX=100002;

struct camion
{
	int c,t;
}v[NMAX];
int n,m,nr[NMAX]={0};

int trans(int t)
{
	int i,sm,nr;
	sm=m;
	for(i=1;i<=n;++i)
	{
		nr=t/(2*v[i].t);
		sm-=(nr*v[i].c);
		if(sm<1) return 1;
	}

	return 0;
}

void sort(int lo,int hi)
{
	int i,j,piv,x;
	camion aux;
	i=lo;j=hi;piv=nr[(lo+hi)/2];

	do
	{
		while(nr[i]>piv) ++i;
		while(nr[j]<piv) --j;
		if(i<=j)
		{
			x=nr[i];nr[i]=nr[j];nr[j]=x;
			aux=v[i];v[i]=v[j];v[j]=aux;
			++i;--j;
		}
	}while(i<=j);

	if(i<hi) sort(i,hi);
	if(j>lo) sort(lo,j);
}

int solgen()
{
	int i,k=0,sm;
	sm=m;
	for(i=1;i<=n&&sm>0;++i,++k) sm-=(v[i].c*nr[i]);
	return k;
}

int main()
{
	FILE *in,*out;
	in=fopen(INF,"r");
	out=fopen(OUF,"w");
	int i,x,st,dr,mij,tmin;
	fscanf(in,"%d%d",&n,&m);
	for(i=1;i<=n;++i) fscanf(in,"%d%d",&v[i].c,&v[i].t);
	st=1;tmin=dr=2000000000;
	while(st<=dr)
	{
		mij=(st+dr)/2;
		if(trans(mij)) { tmin=mij;dr=mij-1; }
		else st=mij+1;
	}

	for(i=1;i<=n;++i) nr[i]=tmin/(2*v[i].t);

	sort(1,n);
	fprintf(out,"%d %d\n",tmin,solgen());
	
	fclose(in);fclose(out);
	return 0;
}