Pagini recente » Cod sursa (job #1031692) | Cod sursa (job #367951) | Cod sursa (job #1115021) | Cod sursa (job #2183349) | Cod sursa (job #336554)
Cod sursa(job #336554)
#include<stdio.h>
struct vect
{
int t,x;
};
int n,x,nr;
vect v[100002];
void read()
{
freopen("garaj.in","r",stdin);
freopen("garaj.out","w",stdout);
scanf("%d%d",&n,&x);
int i;
for(i=1;i<=n;i++)
{
scanf("%d%d",&v[i].x,&v[i].t);
v[i].t*=2;
}
}
int part(int st, int dr)
{
int i,j,m;
vect p,aux;
m=(st+dr)>>1;
p=v[m];
i=st-1;
j=dr+1;
while(1)
{
do{++i;}while(v[i].x*p.t>p.x*v[i].t);
do{--j;}while(v[j].x*p.t<p.x*v[j].t);
if(i<j)
{
aux=v[i];
v[i]=v[j];
v[j]=aux;
}
else
return j;
}
}
void quick(int st, int dr)
{
int p;
if(st<dr)
{
p=part(st,dr);
quick(st,p);
quick(p+1,dr);
}
}
int exista(int t)
{
nr=0;
int i;
long long cx=x;
for(i=1;i<=n;i++)
if(v[i].t<=t)
break;
while(cx>0)
{
cx=cx-v[i].x*(long long)(t/v[i].t);
nr++;
i++;
if(i==n+1)
break;
}
return cx<=0;
}
void rez()
{
int st=1,dr=1000000000,m,cm,cnr;
while(st!=dr)
{
m=(st+dr)>>1;
if(exista(m))
{
cm=m;
dr=m;
cnr=nr;
}
else
st=m+1;
}
printf("%d %d\n",cm,cnr);
}
int main()
{
read();
quick(1,n);
rez();
return 0;
}