Cod sursa(job #328297)

Utilizator DraStiKDragos Oprica DraStiK Data 1 iulie 2009 16:44:00
Problema Garaj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <algorithm>
#define DIM 100005
using namespace std;

struct truck {int c,t;} a[DIM];
int n,m,sol,solp,mint=DIM*DIM;

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)
            mint=minim (mint,m/a[i].c*2*a[i].t);
        else
            mint=minim (mint,(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));
		if (nrc>=m)
			return 1;
	}
	return 0;
}

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=mint; 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;
}