Cod sursa(job #322537)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 9 iunie 2009 01:09:57
Problema Garaj Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 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 nr=0;
	char x;
	while (scanf("%c",&x)!=EOF)
	{
		if (x==' ')
		{
			v[r].a=nr;
			nr=0;
			continue;
		}
		if (x=='\n')
		{
			v[r].b=nr;
			nr=0;
			r++;
			continue;
		}
		nr=nr*10+x-'0';
	}
	if (nr)
		v[r].b=nr;
}
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 < 20; step <<= 1);
    for (i = 0; step; step >>= 1)
        if (i + step < 20 && 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;
}