Pagini recente » Cod sursa (job #2951699) | Cod sursa (job #398882) | Cod sursa (job #1578778) | Cod sursa (job #2268736) | Cod sursa (job #328356)
Cod sursa(job #328356)
#include <stdio.h>
typedef long long i64;
#define NMAX 100001
int N,M,C[NMAX],T[NMAX];
i64 v[NMAX];
int verifica(i64 t)
{
i64 s=0;
int i;
for (i=1;i<=N;++i)
{
s+=(i64)(t/T[i])*C[i];
if (s>=M) return 1;
}
return 0;
}
void qsort(int l,int r){
int i=l,j=r;
i64 x=v[(l+r)/2];
do
{
while (v[i]<x) ++i;
while (v[j]>x) --j;
if (i<=j)
{
i64 tmp=v[i];v[i]=v[j];v[j]=tmp;
++i;--j;
}
}
while (i<=j);
if (i<r) qsort(i,r);
if (j>l) qsort(l,j);
}
int main(){
freopen("garaj.in","r",stdin);
freopen("garaj.out","w",stdout);
scanf("%d %d",&N,&M);
int i;
for (i=1;i<=N;++i) {scanf("%d %d",&C[i],&T[i]);T[i]*=2;}
i64 l=1,r=20000000000002LL,m,tmin=0;
while (l<=r)
{
m=(l+r)/2;
if (verifica(m)) tmin=m,r=m-1;
else l=m+1;
}
for (i=1;i<=N;++i)
v[i]=(i64)(tmin/T[i])*C[i];
qsort(1,N);
for (i=N,m=0;i;--i)
{
m+=v[i];
if (m>=M) break;
}
printf("%lld %d",tmin,N-i+1);
return 0;
}