Cod sursa(job #137930)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 17 februarie 2008 17:11:04
Problema Garaj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

const int N_MAX = 100010;

pair <int, int> v[N_MAX];

long long timp, rez[N_MAX];

long long MAXIM = 1LL << 60;
int N, M;

int merge(long long 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;
	}

//	printf("val = %lld cate = %lld M = %d\n", val, cate, M);
	if (cate >= M) return 1;

	return 0;
}

long long bs()
{
	long long step, i;

	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 cmp(int a, int b)
{
	return (a > b);
}

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);
	}

	timp = bs() + 1;

	for (i = 1; i <= N; i ++) {
		rez[i] = (long long) (v[i].first * (long long) (timp / (2 * v[i].second)));
	}
	sort(rez + 1, rez + N + 1, cmp);

	int nrc = 0;
	long long cate = 0;
	for (i = 1; i <= N; i ++) {
		cate += rez[i];
		nrc ++;

		if (cate >= M) break;
	}

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

	return 0;
}