Cod sursa(job #1609615)

Utilizator gapdanPopescu George gapdan Data 22 februarie 2016 21:41:29
Problema Garaj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <cstdio>
#include <algorithm>
#define NMAX 100005
#define MMAX 2000000000

using namespace std;

int n,m,i,sol,timp,sum;
int cat[NMAX];

struct punct
{
    int c,t;
}v[NMAX];

void cauta()
{
    int st=1,dr=MMAX,mij,i;
    while(st <= dr)
    {
        mij=(st+dr)/2;
        int sum=0;
        for(i=1;i<=n;++i)
        {
            if(2*v[i].t <= mij)
            {
                sum += (mij/(2*v[i].t))*v[i].c;
                if(sum >= m) break;
            }
                else break;
        }
        if(sum >= m) {timp=mij;dr=mij-1;}
            else {st=mij+1;}
    }
}

bool cmp(punct p,punct r)
{
    if(p.t < r.t) return 1;
        else return 0;
}

void solve()
{
    for(i=1;i<=n;++i)
        cat[i]=(timp/(2*v[i].t))*v[i].c;
    sort(cat+1,cat+n+1);
    sol=0;sum=0;
    for(i=1;i<=n;++i)
    {
        if(sum + cat[i] > m) break;
            else
            {
                sum=sum+cat[i];
                ++sol;
            }
    }

}
int main()
{
    freopen("garaj.in","r",stdin);
    freopen("garaj.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i)
        scanf("%d%d",&v[i].c,&v[i].t);
    sort(v+1,v+n+1,cmp);
    cauta();
    solve();
    printf("%d %d",timp,sol);
    return 0;
}