Cod sursa(job #328206)

Utilizator PavelRazvanPavel Razvan PavelRazvan Data 1 iulie 2009 12:30:27
Problema Garaj Scor 40
Compilator cpp Status done
Runda Summer Camp #3 Marime 1.27 kb
#include<algorithm>
using namespace std;
#define DIM 100001
struct garaj
{
    int c,t;
};
garaj a[DIM];
int n,m,dr;
void read ()
{
    int i,nr;
    dr=100000001;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i)
    {
        scanf("%d%d",&a[i].c,&a[i].t);
        a[i].t*=2;
        if(m%a[i].c!=0)
            nr=(m/a[i].c+1)*a[i].t;
        else
            nr=(m/a[i].c)*a[i].t;
        if(nr<dr)
            dr=nr;
    }
}
int check (int sol)
{
    int sum=0,i;
    for(i=1;i<=n;++i)
        sum+=(sol/a[i].t)*a[i].c;
    if(sum<m)
		return 1;
    return 0; 
}
void show (int tmin)
{
    int nrmin,nr[DIM],i;
    for(i=1;i<=n;++i)
        nr[i]=(tmin/a[i].t)*a[i].c;
    sort(nr+1,nr+n+1);
    for(i=n;i>0;--i)
    {
        m-=nr[i];
        if(m<=0)
        {
            nrmin=n-i+1;break;
        }
    }
	printf("%d %d",tmin,nrmin);
}
void solve ()
{
    int st=1,mij,nr,sol=dr;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        nr=check(mij);
        if(nr==0)
        {
            dr=mij-1;
            sol=mij;
        }
        else
            st=mij+1;
    }
    show (sol);
}
int main ()
{
    freopen("garaj.in","r",stdin);
    freopen("garaj.out","w",stdout);
    read ();
    solve ();
    return 0;
}