Cod sursa(job #337011)

Utilizator rumburakrumburak rumburak Data 2 august 2009 12:37:17
Problema Garaj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include<cstdio>
#include<vector>
#include<algorithm>

using namespace std;

const int N = (1<<17);
const long long M = ((long long)1 << 41);

int n,m,c[N],t[N];

void citire()
{
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;++i)
	{
		scanf("%d%d",&c[i],&t[i]);
		t[i]<<=1;
	}
}

bool ok(long long tt)
{
	long long s=0;
	for(int i=0;i<n;++i)
	{
		s+=tt/t[i]*c[i];
		if(s>=m)
			return false;
	}
	return true;
}

long long caut()
{
	long long i,pas;
	for(pas=1 ; pas<=M ; pas<<=1);
	for(i=0 ; pas ; pas>>=1)
		if(i+pas<=M && ok(i+pas))
			i+=pas;
	return i+1;
}

bool comp(long long x,long long y)
{
	return x>y;
}

void numar(long long tt)
{
	int i;
	vector<long long> v;
	for(i=0;i<n;++i)
		v.push_back(tt/t[i]*c[i]);
	sort(v.begin(),v.end(),comp);
	for(i=0;i<n;++i)
	{
		m-=v[i];
		if(m<=0)
		{
			printf("%d\n",i+1);
			return;
		}
	}
	printf("%d\n",n);
}

void calcul()
{
	long long tt=caut();
	printf("%lld ",tt);
	numar(tt);
}

int main()
{
	freopen("garaj.in","r",stdin);
	freopen("garaj.out","w",stdout);
	citire();
	calcul();
	return 0;
}