Cod sursa(job #307181)

Utilizator CezarMocanCezar Mocan CezarMocan Data 23 aprilie 2009 17:19:33
Problema Garaj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <stdio.h>
#include <algorithm>
#define maxn 100100

using namespace std;

struct camion {
	int c, t;
};

int n, i, j, m, rez, nr;
camion v[maxn];
int x[maxn];

int posibil(int t) {
	int i, nr;
	long long sum = 0;
	for (i = 1; i <= n; i++) {
		nr = (t / (2 * v[i].t)) * v[i].c;
		sum += nr;
		if (sum >= m)
			break;
	}

	if (sum >= m)
		return 1;

	return -1;
}

void bsearch(int l, int r) {
	int m, t;

	while (l <= r) {
		m = (l + r) >> 1;
		t = posibil(m);
		
		if (t != -1) {
			if (m < rez) 
				rez = m;
			r = m - 1;
		}
		else
			l = m + 1;
		
	}
}

int main() {
	freopen("garaj.in", "r", stdin);
	freopen("garaj.out", "w", stdout);

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

	rez = 2000000000; nr = 2000000000;
	bsearch(1, 1000000000);

	for (i = 1; i <= n; i++)
		x[i] = (rez / (2 * v[i].t)) * v[i].c;

	sort(x + 1, x + n + 1);

	long long sum = 0;
	for (i = n; i > 0; i--) {
		sum += x[i];
		if (sum >= m) {
			nr = n - i + 1;
			break;
		}
	}

	printf("%d %d\n", rez, nr);

	return 0;
}