Cod sursa(job #961256)

Utilizator primulDarie Sergiu primul Data 11 iunie 2013 20:14:22
Problema Garaj Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include<cstdio>
#define NM 100100
#include<algorithm>
using namespace std;
FILE *f=fopen("garaj.in","r");
FILE *g=fopen("garaj.out","w");
int i,n,m,c[NM],t[NM],mij,ls,ld,best,sol;
int h[NM];
int check(int x);
void eliminate(int x);
int main ()
{
    fscanf(f,"%d%d",&n,&m);
    ld=m;
    for(i=1;i<=n;++i)
    {
        fscanf(f,"%d%d",&c[i],&t[i]);
        t[i]*=2;
        if(1LL*(m+c[i]-1)/c[i]*t[i]<ld)
            ld=1LL*(m+c[i]-1)/c[i]*t[i];
    }
    ls=1;
    while(ls<=ld)
    {
        mij=(ls+ld)>>1;
        if(check(mij))
        {
            best=mij;
            ld=mij-1;
        }
        else
            ls=mij+1;
    }
    eliminate(best);
    fprintf(g,"%d %d",best,sol);
    return 0;
}
int check(int x)
{
    long long S=0;
    for(i=1;i<=n;++i)
    {
        S+=x/t[i]*c[i];
    if(S>=m)
        return 1;
    }
    return 0;
}
void eliminate(int x)
{
    int S=0;
    sol=n;
    for(i=1;i<=n;++i)
    {
        h[i]=x/t[i]*c[i];
        S+=h[i];
    }
    sort(h+1,h+n+1);
    for(i=1;i<=n;++i)
    {
        if(S-h[i]>=m)
            S-=h[i],sol--;
        else
            break;
    }
}