Cod sursa(job #143260)

Utilizator slayer4uVictor Popescu slayer4u Data 26 februarie 2008 09:22:37
Problema Garaj Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <stdio.h>
#include <algorithm>
using namespace std;

long long i, j, k, n, m, timp, lolol;

struct lol
{
	long long q, t, p, r;
};
lol c[100001];


int cmpf(lol a, lol b)
{
	return a.p > b.p;
}

int ok(long long timp)
{
	long sum = 0;
	for (long i = 1; i <= n && sum < m; i ++)
		sum += c[i].q * (timp / (2 * c[i].t));
	if (sum >= m)
		return 1;
	return 0;
}

long long realizabil(long long timp)
{
	long long mc = m;
	lolol = timp;
	
	for (i = 1; i <= n; i ++)
		c[i].p = (timp / (2 * c[i].t)) * c[i].q;
	sort(c + 1, c + n + 1, cmpf);

	for (i = 1; i <= n && mc > 0; i ++)
	{
		mc = mc - (timp / (c[i].t * 2) * c[i].q);
	}
	if (mc <= 0)
		return i - 1;
	return -1;
}

void cautbin(long long st, long long dr)
{
	long long m = (st + dr) / 2;
	long long k = ok(m);
	if (st >= dr || dr - st == 1) 
	{
		if (k)
			timp = timp > m ? m : timp;
		k = ok(m + 1);
		if (k)
			timp = timp > (m + 1) ? (m + 1) : timp;
		return ;
	}
	if (k)
	{
		timp = timp > m ? m : timp;
		cautbin(st, m);
	}
	else
		cautbin(m, dr);
}

int main()
{
	freopen ("garaj.in", "rt", stdin);
	freopen ("garaj.out", "wt", stdout);

	scanf("%lld %lld", &n, &m);
	for (i = 1; i <= n; i ++)
	{
		scanf("%lld %lld", &c[i].q, &c[i].t);
	

	}

	timp = 1337000000000000LL;
	cautbin(1, (m / c[1].q + m % c[1].q) * 2 * c[1].t);

	printf("%lld %lld", timp, realizabil(timp));

	return 0;
}