Cod sursa(job #138380)

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

using namespace std;

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

typedef long long i64;

vector <int> C, T;


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;
	
	int n, nr;

	fi = fopen(iname, "r");

	fscanf(fi, "%d %d", &n, &nr);
	C.resize(n);
	T.resize(n);
	for (int i = 0; i < (int)n; ++ i)
		fscanf(fi, "%d %d", &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) < nr)
			delta += stp;

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

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

	sort(C.begin(), C.end());
	reverse(C.begin(), C.end());

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

	fo = fopen(oname, "w");

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

	fclose(fo);

	return 0;
}