Pagini recente » Borderou de evaluare (job #689148) | Borderou de evaluare (job #1135282) | Borderou de evaluare (job #3245612) | Borderou de evaluare (job #473400) | Cod sursa (job #142501)
Cod sursa(job #142501)
#include <cstdio>
#define INF "garaj.in"
#define OUF "garaj.out"
using namespace std;
const int NMAX=100002;
struct camion
{
int c,t;
}v[NMAX];
int n,m,nr[NMAX]={0};
int trans(int t)
{
int i,sm,nr;
sm=m;
for(i=1;i<=n;++i)
{
nr=t/(2*v[i].t);
sm-=(nr*v[i].c);
if(sm<1) return 1;
}
return 0;
}
void sort(int lo,int hi)
{
int i,j,piv,x;
camion aux;
i=lo;j=hi;piv=nr[(lo+hi)/2];
do
{
while(nr[i]>piv) ++i;
while(nr[j]<piv) --j;
if(i<=j)
{
x=nr[i];nr[i]=nr[j];nr[j]=x;
aux=v[i];v[i]=v[j];v[j]=aux;
++i;--j;
}
}while(i<=j);
if(i<hi) sort(i,hi);
if(j>lo) sort(lo,j);
}
int solgen()
{
int i,k=0,sm;
sm=m;
for(i=1;i<=n&&sm>0;++i,++k) sm-=(v[i].c*nr[i]);
return k;
}
int main()
{
FILE *in,*out;
in=fopen(INF,"r");
out=fopen(OUF,"w");
int i,x,st,dr,mij,tmin;
fscanf(in,"%d%d",&n,&m);
for(i=1;i<=n;++i) fscanf(in,"%d%d",&v[i].c,&v[i].t);
st=1;tmin=dr=2000000000;
while(st<=dr)
{
mij=(st+dr)/2;
if(trans(mij)) { tmin=mij;dr=mij-1; }
else st=mij+1;
}
for(i=1;i<=n;++i) nr[i]=tmin/(2*v[i].t);
sort(1,n);
fprintf(out,"%d %d\n",tmin,solgen());
fclose(in);fclose(out);
return 0;
}