Cod sursa(job #665189)

Utilizator danalex97Dan H Alexandru danalex97 Data 21 ianuarie 2012 18:54:24
Problema Garaj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>
using namespace std;

#define lung 100011
#define extr 30000

int t[lung],c[lung];
int times,n,m;
int co;
int sum;

int pozitionare(int st,int dr)
{
	int xst,xdr;
	xst=0;
	xdr=-1;
	while (st<dr)
		if ( (times/t[dr]+1)/2*c[dr] < (times/t[st]+1)/2*c[st] )
		{
			st+=xst;
			dr+=xdr;
		}
	else
	{
        swap(t[st],t[dr]);
		swap(c[st],c[dr]);
        xst=1-xst;
        xdr=-1-xdr;
        st+=xst;
		dr+=xdr;
	}
	return st;
}

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

int cautbin(int st,int dr)
{
	int mij=(st+dr)/2;
	int s=0;
	if (st!=dr)
	{
		for (int i=1;i<n;++i)
			if (t[i]<=mij)
				s+=(mij/t[i]+1)/2*c[i];
		int x;
		if (s>m)
			x=cautbin(st,mij);
		else
			if (s<m)
				x=cautbin(mij+1,dr);
			else x=mij;
		return x;
	}
	else
		return st;
}

void elimin(int i)
{
	swap(c[i],c[co]);
	swap(t[i],t[co]);
	--co;
}

int main()
{
	freopen("garaj.in","r",stdin);
	freopen("garaj.out","w",stdout);
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;++i)
		scanf("%d%d",&c[i],&t[i]);
	times=cautbin(1,extr);
	co=n;
	for (int i=1;i<=n;++i)
		if (t[i]>times)
			elimin(i);
	n=co;
	quick(1,n);
	for (int i=1;i<=n;++i)
		sum+=(times/t[i]+1)/2*c[i];
	while (sum-(times/t[n]+1)/2*c[n]>m)
	{
		n--;
		sum-=(times/t[n]+1)/2*c[n];
	}
	printf("%d %d\n",times,n);
	return 0;
}