Pagini recente » Cod sursa (job #1819373) | Cod sursa (job #496829) | Cod sursa (job #1759378) | Cod sursa (job #2124555) | Cod sursa (job #523752)
Cod sursa(job #523752)
#include <stdio.h>
#include <assert.h>
#include <algorithm>
using namespace std;
#define nmax 100111
#define FOR(i,s,d) for(i=(s);i<(d);++i)
#define mp make_pair
#define f first
#define s second
#define pt(i) (1<<(i))
int n,m,sol,C[nmax],T[nmax];
int MIN(int a,int b) { return a<b?a:b; }
int doit(int x)
{
int aux=m,i;
FOR(i,0,n)
if((aux-=x/T[i]*C[i])<=0)
return 1;
return 0;
}
int main()
{
assert(freopen("garaj.in","r",stdin));
freopen("garaj.out","w",stdout);
int i,j=0;
assert(scanf("%d %d",&n,&m)==2);
assert(1<=n && n<=100000);
assert(1<=m && m<=1000000000);
FOR(i,0,n)
{
assert(scanf("%d %d",&C[i],&T[i])==2);
assert(1<=C[i] && C[i]<=1000);
assert(1<=T[i] && T[i]<=1000);
}
for(i=30;i>=0;--i)
if(!doit(sol+pt(i)))
sol+=pt(i);
printf("%d ",2*(sol+1));
FOR(i,0,n)
C[i]=(sol+1)/T[i]*C[i];
sort(C,C+n);
reverse(C,C+n);
FOR(i,0,n)
if((j+=C[i])>=m)
break;
printf("%d\n",i+1);
return 0;
}