Pagini recente » Cod sursa (job #1149257) | Cod sursa (job #857906) | Cod sursa (job #2685636) | Cod sursa (job #3187424) | Cod sursa (job #142536)
Cod sursa(job #142536)
#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 tmp)
{
int i,sm,k;
sm=0;
for(i=1;i<=n;++i)
{
k=tmp/(2*v[i].t);
sm+=(k*v[i].c);
if(sm>=m) return 1;
}
if(sm>=m) 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=0;
for(i=1;i<=n&&sm<m;++i)
{
sm+=nr[i];
++k;
}
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;dr=2000000000;tmin=dr;
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))*v[i].c;
sort(1,n);
x=solgen();
fprintf(out,"%d %d",tmin,x);
fclose(in);fclose(out);
return 0;
}