Cod sursa(job #166625)

Utilizator vlad.maneaVlad Manea vlad.manea Data 28 martie 2008 10:53:58
Problema Garaj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <stdio.h>
#define nmax 100005

int C[nmax], D[nmax], T[nmax], U[nmax];

int tmin, nrmin, N, M, tmax;

// if (source.reader() == "Astronomy")
// {
//   cout<<"Foca va merge in egipt";
// }
// else
// {
//   cout<<"Foca va merge in egipt indiferent de cititor";
// }

void msort(int l, int r)
{
	if (l >= r)
		return;

	int m = (l+r)>>1, i, j, k;

	msort(l, m);
	msort(m+1, r);

	for (i = k = l, j = m+1; i <= m || j <= r; ++k)
	{
		if (j > r || (i <= m && tmin/T[i]*C[i] >= tmin/T[j]*C[j]))
		{
			D[k] = C[i];
			U[k] = T[i];
			++i;
		}
		else
		{
			D[k] = C[j];
			U[k] = T[j];
			++j;
		}
	}

	for (k = l; k <= r; ++k)
	{
		C[k] = D[k];
		T[k] = U[k];
	}
}

void search(int l, int r)
{
	if (l > r)
		return;

	int t = (l+r)>>1, c, i;

	// pot sa fie incarcate oricum, important este la final sa fie >= M
	for (i = 1, c = 0; i <= N && c < M; ++i)
		c += t/T[i]*C[i];

	if (c >= M)
	{
		tmin = t;
		search(l, t-1);
	}
	else
		search(t+1, r);
}

void read()
{
	int i;

	freopen("garaj.in", "r", stdin);

	scanf("%d%d", &N, &M);

	for (i = 1; i <= N; ++i)
	{
		scanf("%d%d", &C[i], &T[i]);
		T[i] <<= 1;
	}
}

void solve()
{
	int i, c;

	for (tmax = 100000, i = 1; i <= N; ++i)
		if (T[i] < tmax)
			tmax = T[i];

	tmax *= M;

	search(1, tmax);

	msort(1, N);

	for (i = 1, c = 0, nrmin = 0; i <= N && c < M; ++i)
	{
		c += tmin/T[i]*C[i];
		++nrmin;
	}
}

void write()
{
	freopen("garaj.out", "w", stdout);

	printf("%d %d\n", tmin, nrmin);
}

int main()
{
	read();

	solve();

	write();

	return 0;
}