Cod sursa(job #328356)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 1 iulie 2009 19:12:47
Problema Garaj Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <stdio.h>
typedef long long i64;
#define NMAX 100001
int N,M,C[NMAX],T[NMAX];
i64 v[NMAX];
int verifica(i64 t)
{
    i64 s=0;
    int i;
    for (i=1;i<=N;++i)
    {
        s+=(i64)(t/T[i])*C[i];
        if (s>=M) return 1;
    }
    return 0;
}
void qsort(int l,int r){
     int i=l,j=r;
     i64 x=v[(l+r)/2];
     do
     {
         while (v[i]<x) ++i;
         while (v[j]>x) --j;
         if (i<=j)
         {
           i64 tmp=v[i];v[i]=v[j];v[j]=tmp;
           ++i;--j;
         }
     }
     while (i<=j);
     if (i<r) qsort(i,r);
     if (j>l) qsort(l,j);
     } 
int main(){
    freopen("garaj.in","r",stdin);
    freopen("garaj.out","w",stdout);
    scanf("%d %d",&N,&M);
    int i;
    for (i=1;i<=N;++i) {scanf("%d %d",&C[i],&T[i]);T[i]*=2;}
    i64 l=1,r=20000000000002LL,m,tmin=0;
    while (l<=r)
    {
          m=(l+r)/2;
          if (verifica(m)) tmin=m,r=m-1;
                      else l=m+1;
    } 
      
    for (i=1;i<=N;++i)
      v[i]=(i64)(tmin/T[i])*C[i];
      
    
    qsort(1,N);
    for (i=N,m=0;i;--i)
    {
        m+=v[i];
        if (m>=M) break;
    }
    
    printf("%lld %d",tmin,N-i+1);
    
    return 0;
}