Cod sursa(job #328198)

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

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

int minim (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=minim (maxt,m/a[i].c*2*a[i].t);
        else
            maxt=minim (maxt,(m/a[i].c+1)*2*a[i].t);
    }*/
}

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

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

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

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

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