Cod sursa(job #178880)

Utilizator moga_florianFlorian MOGA moga_florian Data 15 aprilie 2008 12:38:02
Problema Garaj Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include<stdio.h>
#define Nmax 100010

int C[Nmax], T[Nmax];
int N,M;

int timp(long long Tmax){

    long long total = 0;
    for(int i=1;i<=N;i++)
        total += (long long)C[i]*(Tmax / (2*T[i]));

    if(total >= (long long)M)
        return 1;
    return 0;

}

int main(){

    FILE *fin = fopen("garaj.in","r"),
         *fout = fopen("garaj.out","w");

    fscanf(fin,"%d%d",&N,&M);

    for(int i=1;i<=N;i++)
        fscanf(fin,"%d%d",&C[i],&T[i]);

    long long li = 0, lf = (long long)1000000000 * (long long) 4000, mij;
    while(lf-li>1){
        mij = (li+lf)>>1;
        if(timp(mij))
            lf = mij;
        else
            li = mij;
    }

    long long Tmin;
    if(timp(li))
        Tmin = li;
    else
        Tmin = lf;

    fprintf(fout,"%lld ",Tmin);

    for(int i=1;i<=N;i++)
        C[i] = C[i]*(Tmin / (2*T[i]));

    //sort C
    for(int i=1;i<=N;i++){
        int j = i;
        while(j/2 && C[j/2] > C[j]){
            int aux = C[j/2];
            C[j/2] = C[j];
            C[j] = aux;
            j>>=1;
        }
    }

    int cate = N;
    while(cate>1){
        int aux = C[1];
        C[1] = C[cate];
        C[cate] = aux;
        cate--;

        int j=1;
        while(1){
            int k = 2*j;
            if(k>cate) break;
            if(k+1<=cate && C[k+1] < C[k]) k++;
            if(C[j] < C[k]) break;

            aux = C[j];
            C[j] = C[k];
            C[k] = aux;
            j = k;
        }
    }

    int Nrmin = 0, total = 0;
    while(total < M){
        Nrmin++;
        total += C[Nrmin];
    }

    fprintf(fout,"%d\n",Nrmin);

    fclose(fin);
    fclose(fout);
    return 0;
}