Cod sursa(job #260380)

Utilizator mihaipoascaPoasca Mihai mihaipoasca Data 16 februarie 2009 23:08:09
Problema Garaj Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include<stdio.h>

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

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

int merge(int t){
    int cate=0;
    for(int i=1;i<=N;i++)
        cate+=t/(2*T[i])*C[i];
    if(cate>=M)
        return 1;
    return 0;

}


void swap(int i,int j){
    C[i]^=C[j];C[j]^=C[i];C[i]^=C[j];
}
int main(){
    fscanf(fin,"%d %d",&N,&M);
    for(int i=1;i<=N;i++)
        fscanf(fin,"%d %d",&C[i],&T[i]);

    int li=1,lf=1000*1000;

    while(lf-li>1){
        int mij=(li+lf)>>1;

        if(merge(mij))
            lf=mij;
        else
            li=mij;
    }

    int Tmin;
    if(merge(li))
        Tmin=li;
    else
        Tmin=lf;

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

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

        int j=i;
        while(j/2 && C[j]<C[j/2]){
            swap(j,j/2);
            j>>=1;
        }
    }

    int Nh=N;
    while(Nh>1){
        swap(1,Nh);
        --Nh;

        int i=1,j;
        while(1){
            j=2*i;
            if(j>Nh) break;
            if(j+1<=Nh && C[j+1]<C[j]) ++j;
            if(C[j/2]<C[j]) break;
            swap(j,j/2);
            i=j;
        }
    }

    int cnt=0;
    for(int i=1;i<=N&&M>0;M-=C[i],i++,cnt++);

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

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