Cod sursa(job #1262938)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 13 noiembrie 2014 18:27:48
Problema Lapte Scor 60
Compilator c Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <stdio.h>
#define EPSILON 0.000001
#define MAXN 100
int n, k, x[MAXN], y[MAXN], X[MAXN], Y[MAXN], poz[MAXN];
inline int tata(int a){
    return (a-1)/2;
}
inline int fiust(int a){
    return a*2+1;
}
inline int fiudr(int a){
    return a*2+2;
}
inline void swap(int a, int b){
    int aux=poz[a];
    poz[a]=poz[b];
    poz[b]=aux;
}
inline int trbSchimb(int a, int b){
    return (x[poz[a]]*y[poz[b]]<x[poz[b]]*y[poz[a]]);
}
inline void coborare(int p){
    int f, q;
    f=1;
    while((f==1)&&(fiust(p)<n)){
        q=fiust(p);
        if((fiudr(p)<n)&&(trbSchimb(fiudr(p), q)==1)){
            q=fiudr(p);
        }
        if(trbSchimb(q, p)==1){
            swap(p, q);
            p=q;
        }else{
            f=0;
        }
    }
}
inline void heapify(){
    int i;
    for(i=tata(n-1); i>=0; i--){
        coborare(i);
    }
}
inline void heapSort(){
    while(n>1){
        n--;
        swap(0, n);
        coborare(0);
    }
}
inline int lapte(int t){
    int i, B, rez;
    B=k;
    i=0;
    while((i<n)&&(B-t/y[poz[i]]>=0)){
        X[poz[i]]=0;
        Y[poz[i]]=t/y[poz[i]];
        B-=t/y[poz[i]];
        i++;
    }
    rez=0;
    if(i<n){
        X[poz[i]]=t/x[poz[i]]-B*y[poz[i]]/x[poz[i]];
        Y[poz[i]]=B;
        rez+=t/x[poz[i]]-B*y[poz[i]]/x[poz[i]];
        i++;
        while(i<n){
            X[poz[i]]=t/x[poz[i]];
            Y[poz[i]]=0;
            rez+=t/x[poz[i]];
            i++;
        }
    }
    return rez;
}
int main(){
    int cn, i, rez, pas;
    FILE *fin, *fout;
    fin=fopen("lapte.in", "r");
    fout=fopen("lapte.out", "w");
    fscanf(fin, "%d%d", &n, &k);
    for(i=0; i<n; i++){
        fscanf(fin, "%d%d", &x[i], &y[i]);
        poz[i]=i;
    }
    heapify();
    cn=n;
    heapSort();
    n=cn;
    rez=0;
    for(pas=1<<6; pas!=0; pas>>=1){
        if(lapte(rez+pas)<k){
            rez+=pas;
        }
    }
    rez++;
    fprintf(fout, "%d\n", rez);
    i=lapte(rez);
    for(i=0; i<n; i++){
        fprintf(fout, "%d %d\n", X[i], Y[i]);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}