Cod sursa(job #328187)

Utilizator DraStiKDragos Oprica DraStiK Data 1 iulie 2009 12:02:27
Problema Garaj Scor 50
Compilator cpp Status done
Runda Summer Camp #3 Marime 1.26 kb
#include <algorithm>
#define DIM 100005
using namespace std;

struct truck {int c,t;} a[DIM];
int n,m,mij,sol,solp,maxt=1<<31-1;

int maxim (int a,int b)
{
    if (a>b)
        return a;
    return b;
}

void read ()
{
    int i;
    scanf ("%d%d",&n,&m);
    for (i=1; i<=n; ++i)
    {
        scanf ("%d%d",&a[i].c,&a[i].t);
        if (m%a[i].c==0)
            maxt=maxim (maxt,m/a[i].c*2*a[i].t);
        else
            maxt=maxim (maxt,(m/a[i].c+1)*2*a[i].t);
    }
}

int cmp (truck a,truck b)
{
    return a.c*(mij/(2*a.t))>b.c*(mij/(2*b.t));
}

int test (int val,int &pers)
{
    int i,nrc;
    for (nrc=0, i=1; i<=n; ++i)
    {
        nrc+=a[i].c*(val/(2*a[i].t));
        pers=i;
        if (nrc>=m)
            return 1;
    }
	return 0;
}

void solve ()
{
    int st,dr,pers;
    for (st=1, dr=maxt; st<=dr; )
    {
        pers=0;
        mij=(st+dr)/2;
        sort (a+1,a+n+1,cmp);
        if (test (mij,pers))
        {
            sol=mij;
            solp=pers;
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    printf ("%d %d",sol,solp);
}

int main ()
{
    freopen ("garaj.in","r",stdin);
    freopen ("garaj.out","w",stdout);
    read ();
    solve ();
    return 0;
}