Cod sursa(job #1778055)

Utilizator silkMarin Dragos silk Data 13 octombrie 2016 12:55:47
Problema Garaj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>
#include <algorithm>
#define INF 1LL<<37
#define NMax 100000
#define DIM 10000
#define ll long long
using namespace std;
char buff[DIM];
int poz;

int x[NMax+1];
int y[NMax+1];
int N,M,nr;
ll v[NMax+1];

void citeste(int& numar)
{
    numar = 0;
    while(buff[poz]<'0'||buff[poz]>'9')
    if(++poz==DIM) fread(buff,1,DIM,stdin),poz=0;

    while(buff[poz]>='0'&&buff[poz]<='9')
    {
        numar = numar * 10 + buff[poz] - '0';
        if(++poz==DIM) fread(buff,1,DIM,stdin),poz=0;
    }
}

bool is_good(ll X)
{
    int i;
    ll sum=0;

    for(i = 1; i <= N; ++i)
    {
        v[i] = 1LL * x[i] * ( X / ( 2 * y[i] ) );
        sum = sum + v[i];
        if( sum >= M ) return 1;
    }

    return 0;
}

int main(){
    freopen("garaj.in","r",stdin);
    freopen("garaj.out","w",stdout);

    int i;
    ll sum,st,dr,mid,T;

    scanf("%d %d",&N,&M);
    for(i = 1; i <= N; ++i)
    {
        citeste(x[i]);
        citeste(y[i]);
    }

    for(st = 1, dr = INF; st <= dr; )
    {
        mid = (st+dr)>>1;
        if( is_good(mid) ) { T = mid; dr = mid - 1; }
        else st = mid + 1;
    }

    for(i = 1; i <= N; ++i) v[i] = 1LL * x[i] * ( T / ( 2 * y[i] ) );
    sort(v+1,v+N+1);
    sum = M;
    for(i = N; i >= 1 && sum > 0 ; --i) sum = sum - v[i];
    nr = N-i;

    printf("%lld %d\n", T, nr);



return 0;
}