Cod sursa(job #665190)

Utilizator danalex97Dan H Alexandru danalex97 Data 21 ianuarie 2012 18:57:30
Problema Garaj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <fstream>
#include <algorithm>
#include <utility>

using namespace std;

ifstream fin("garaj.in");
ofstream fout("garaj.out");

void Read();
void Solve();
bool Test(int x);
void Write();

int n, m;
pair<int, int> v[100001];
int mint, minc;

int main()
{
	Read();
	Solve();
	Write();
}

void Read()
{
	fin >> n >> m;
	for (int i = 1; i <= n; ++i)
		fin >> v[i].second >> v[i].first;
	fin.close();
}

void Solve()
{
	int step, i;
	for (step = 1; step << 1 <= 1000000000; step <<= 1);
	for (i = 1000000000; step; step >>= 1)
		if (i - step >= 0 && Test(i - step))
			i -= step, mint = i;
	for (int i = 1; i <= n; ++i)
		v[i].first = int(mint / (v[i].first * 2)) * v[i].second;
	sort(v + 1, v + n + 1);
	int sum = 0;
	for (int i = n; i >= 1 && sum < m; --i)
		sum += v[i].first, ++minc;
}

bool Test(int x)
{
	int mxm = 0;
	for (int i = 1; i <= n; ++i)
	{
		mxm += int(x / (v[i].first * 2)) * v[i].second;
		if (mxm >= m) return true;
	}
	return false;
}

void Write()
{
	fout << mint << ' ' << minc;
	fout.close();
}