Cod sursa(job #137325)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 17 februarie 2008 11:16:12
Problema Garaj Scor 40
Compilator cpp Status done
Runda preONI 2008, Runda 4, Clasa a 10-a Marime 1.18 kb
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

const int N_MAX = 100010;

pair <int, int> v[N_MAX];

int cmp(pair <int, int> a, pair <int, int> b)
{
	return ((a.first / (double) a.second) > (b.first / (double) b.second));
}

int MAXIM = 1000000000;
int N, M;

int merge(int val)
{
	int i;
	long long cate = 0;
	for (i = 1; i <= N; i ++) {
		cate += (long long) v[i].first * (long long) (val / (2 * v[i].second));
		if (cate >= M) break;
	}

	if (cate >= M) return 1;

	return 0;
}

int bs()
{
	int i, step;

	for (step = 1; step <= MAXIM; step <<= 1);
	for (i = 0; step; step >>= 1) {
		if (i + step <= MAXIM && !merge(i + step)) i += step;
	}

	return i;
}

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

	int i, x, y;

	scanf("%d %d\n", &N, &M);
	for (i = 1; i <= N; i ++) {
		scanf("%d %d\n", &x, &y);
		v[i] = make_pair(x, y);
	}

	int timp = bs() + 1;

	sort(v + 1, v + N + 1, cmp);

	int nrc = 0;
	long long cate = 0;
	for (i = 1; i <= N; i ++) {
		cate += (long long) (v[i].first * (long long) (timp / (2 * v[i].second)));
		nrc ++;

		if (cate >= M) break;
	}

	printf("%d %d\n", timp, nrc);

	return 0;
}