Cod sursa(job #167977)

Utilizator tm_raduToma Radu tm_radu Data 30 martie 2008 14:45:54
Problema Garaj Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <stdio.h>
#define NM 100001

int n, m;
int c[NM], t[NM];
int i, j, k;
int tmin, cmin;

void Qsort(int st, int dr);
void Cbin();
int Ok(int k);

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", &c[i], &t[i]);
    
    Cbin(); // tmin
    
    // cmin
    int can = 0, ture;
    for ( i = 1; i <= n; i++ )
        ture = tmin/(2*t[i]),
        c[i] = ture*c[i];
    Qsort(1, n);
    
    for ( i = 1; i <= n; i++ )
    {
        can += c[i];
        if ( can >= m ) 
            break;
    }        
    cmin = i;
    
    printf("%d %d\n", tmin, cmin);
    
    return 0;
}

void Qsort(int st, int dr)
{
    int i = st-1;
    int j = dr+1;
    do
    {
        do { i++; } while ( c[i] > c[st] );
        do { j--; } while ( c[st] > c[j] );
        if ( i <= j )
        {
            int aux = c[i]; c[i] = c[j]; c[j] = aux;
        }
    } while ( i <= j );
    if ( i < dr ) Qsort(i, dr);
    if ( st < j ) Qsort(st, j);
}

void Cbin()
{
    int st = 0;
    int dr = 1000000;
    while ( st != dr )
    {
        int mij = st + (dr-st)/2;
        if ( Ok(mij) ) dr = mij;
        else           st = mij+1;
    }
    tmin = st;
}

int Ok(int k)
{
    int ture;
    int can = 0;
    for ( i = 1; i <= n; i++ )
    {
        ture = k/(2*t[i]);
        can += ture*c[i];
        if ( can >= m ) return 1;
    }
    return 0;
}