Cod sursa(job #142536)

Utilizator megabyteBarsan Paul megabyte Data 24 februarie 2008 18:25:02
Problema Garaj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 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 tmp)
{
	int i,sm,k;
	sm=0;
	for(i=1;i<=n;++i)
	{
		k=tmp/(2*v[i].t);
		sm+=(k*v[i].c);
		if(sm>=m) return 1;
	}
	if(sm>=m) 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=0;
	for(i=1;i<=n&&sm<m;++i)
	{
		sm+=nr[i];
		++k;
	}
	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;dr=2000000000;tmin=dr;
	
	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))*v[i].c;

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