Pagini recente » Cod sursa (job #1888826) | Cod sursa (job #2479582) | Cod sursa (job #273052) | Cod sursa (job #2828392) | Cod sursa (job #336575)
Cod sursa(job #336575)
#include<stdio.h>
struct vect
{
int t,x;
};
int n,x,nr;
vect min;
vect v[100002];
void read()
{
freopen("garaj.in","r",stdin);
freopen("garaj.out","w",stdout);
scanf("%d%d",&n,&x);
int i;
min.t=1000000000;
for(i=1;i<=n;i++)
{
scanf("%d%d",&v[i].x,&v[i].t);
v[i].t*=2;
if(v[i].t<min.t)
{
min.t=v[i].t;
min.x=v[i].x;
}
}
}
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)
{
if(i==n+1)
break;
if(v[i].t>t)
{
i++;
continue;
}
cx=cx-v[i].x*(long long)(t/v[i].t);
nr++;
i++;
}
return cx<=0;
}
void rez()
{
int st=min.t,dr,m,cm,cnr;
if(x/min.x)
dr=(int)(x/min.x)*min.t;
else
dr=min.t;
while(st!=dr)
{
m=(st+dr)>>1;
if(exista(m))
{
cm=m;
dr=m;
cnr=nr;
}
else
st=m+1;
}
while(exista(st)==0)
st++;
while(exista(st))
{
cnr=nr;
cm=st;
st--;
}
printf("%d %d\n",cm,cnr);
}
int main()
{
read();
quick(1,n);
rez();
return 0;
}