Cod sursa(job #322825)

Utilizator taloibogdanTaloi Bogdan Cristian taloibogdan Data 9 iunie 2009 22:23:02
Problema Garaj Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
using namespace std;
struct che{long x,t;}a[100050];
long n,m,i,maxx,st,dr,mi,s,t,nr;
long cmp(che a,che b)
{if(t/a.t*a.x>t/b.t*b.x)return 1;
return 0;}
/*long partit(che a[ ],long st, long dr)
{long i,j,m;
 che piv,aa;
 m=random()%n+1;
 piv=a[m];
 i=st-1;
 j=dr+1;
 while(1)
  {do{++i;} while(t/a[i].t*a[i].x>t/piv.t*piv.x);
   do{--j;} while(t/a[j].t*a[j].x<t/piv.t*piv.x);
   if (i<j)
	 {aa=a[i];a[i]=a[j];a[j]=aa;}
	   else
	 return j;
  }
}
void quicks(che a[ ],long st,long dr)
{long p;
 if (st<dr)
   {p=partit(a,st,dr);
	quicks(a,st,p);
	quicks(a,p+1,dr);
   }
}*/
int main()
{
 freopen("garaj.in","r",stdin);
 freopen("garaj.out","w",stdout);
 scanf("%ld%ld",&n,&m);
 for(i=1;i<=n;++i)
    {scanf("%ld%ld",&a[i].x,&a[i].t);
     a[i].t*=2;
     if(m/a[i].x*a[i].t>maxx)maxx=m/a[i].x*a[i].t;}
 st=1;dr=maxx+5;
 while(st<=dr)
  {mi=(st+dr)>>1;
   s=0;
   for(i=1;i<=n;++i)
      s+=(a[i].x*(mi/a[i].t));
   if(s>=m)
     {t=mi;dr=mi-1;}
     else st=mi+1;}
 sort(a+1,a+n+1,cmp);
// quicks(a,1,n);
 for(i=1;i<=n&&m>0;++i,++nr)
    m-=(t/a[i].t*a[i].x);
 printf("%ld %ld\n",t,nr);
 return 0;
}