Cod sursa(job #322541)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 9 iunie 2009 01:16:49
Problema Garaj Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <stdio.h>
#include <stdlib.h>
#define N 100005
int n,m,tmin,nrmin,r;
struct camion
{
	int a,b;//a= capacitate; b=timp pt un transport
};
camion v[N];
void read()
{
	scanf("%d%d",&n,&m);
	int i;
	for (i=1; i<=n; i++)
		scanf("%d%d",&v[i].a,&v[i].b);
}
int calc(int p)
{
	int i,s=0,salv;
	for (i=1; i<=n; i++)
	{
		salv=p;
		s+=v[i].a*(salv/(2*v[i].b));
		if (s>=m)
			break;
	}
	return s;
}
int cbin()
{
    int i, step;
    for (step = 1; step < 22542; step <<= 1);
    for (i = 0; step; step >>= 1)
        if (i + step < 22542 && calc(i + step) < m)
           i += step;
    return ++i;
}
int calcul(int x,int y,int t)
{
	int rez;
	rez=x*(t/(2*y));
	return rez;
}
int compar(const void *p,const void*q)
{
	camion x=*(camion*)p;
	camion y=*(camion*)q;
	int g,h;
	g=calcul(x.a,x.b,tmin);
	h=calcul(y.a,y.b,tmin);
	if (g>h)
		return -1;
	if (g<h)
		return 1;
	return 0;
}
void solve()
{
	tmin=cbin();
	qsort(v+1,n,sizeof(v[0]),compar);
	int i,s_act=0,salv;
	for (i=1; i<=n; i++)
	{
		salv=tmin;
		s_act+=v[i].a*(salv/(2*v[i].b));
		nrmin=i;
		if (s_act>=m)
			break;
	}
	printf("%d %d\n",tmin,nrmin);
}
int main()
{
	freopen("garaj.in","r",stdin);
	freopen("garaj.out","w",stdout);
	read();
	solve();
	return 0;
}