Cod sursa(job #138381)

Utilizator MariusMarius Stroe Marius Data 18 februarie 2008 15:14:21
Problema Garaj Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const char iname[] = "garaj.in";
const char oname[] = "garaj.out";

typedef long long i64;

#define MAXN  100005

i64 C[MAXN], T[MAXN];

int n, nrst;


i64 work(int n, i64 delta)
{
	i64 cnt = 0;

	for (int i = 0; i < n; ++ i)
		cnt += ((i64)(delta / (2 * T[i]))) * C[i];

	return cnt;
}

int main(void)
{
	FILE *fi, *fo;

	fi = fopen(iname, "r");

	fscanf(fi, "%d %d", &n, &nrst);
	for (int i = 0; i < n; ++ i)
		fscanf(fi, "%lld %lld", &C[i], &T[i]);

	fclose(fi);

	const i64 inf = (i64)(2e12);
	i64 delta, stp;

    for (stp = 1; stp <= inf; stp <<= 1) ;

	for (delta = 0; stp; stp >>= 1) if (delta + stp <= inf) 
		if (work(n, delta + stp) < nrst)
			delta += stp;

	if (work(n, delta) < nrst)
		delta ++;

	for (int i = 0; i < n; ++ i)
		C[i] = (delta / (2 * T[i])) * C[i];

	sort(C, C + n);

	i64 cnt = 0;
	int res = 0;
	for (int i = n - 1; i >= 0; -- i)
	{
		cnt += C[i];
		res ++;
		if (cnt >= (i64)nrst)
			break ;
	}

	fo = fopen(oname, "w");

	fprintf(fo, "%lld %d\n", delta, res);

	fclose(fo);

	return 0;
}