Cod sursa(job #328210)

Utilizator PavelRazvanPavel Razvan PavelRazvan Data 1 iulie 2009 12:34:04
Problema Garaj Scor 40
Compilator cpp Status done
Runda Summer Camp #3 Marime 1.32 kb
#include<algorithm>
using namespace std;
#define DIM 100005
#define INF DIM*DIM
struct garaj
{
    int c,t;
};
garaj a[DIM];
int n,m,dr;
void read ()
{
    int i,nr;
    dr=INF;
    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)
{
    long long sum=0;
    int i;
    for(i=1;i<=n;++i)
    {
        sum+=(sol/a[i].t)*a[i].c;
        if(sum>=m)
		  return 0; 
    }
    return 1;
}
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;
}