Cod sursa(job #1573166)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 19 ianuarie 2016 14:30:41
Problema Garaj Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
# include <cstdio>
# include <algorithm>
# define DIM 100010
using namespace std;

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

long long s,t[DIM],c[DIM],i,n,m,st,dr,mij,trans[DIM],k,nr;

char b[1200020];

long long maxtrans(int r){
    long long s=0;
    for(int i=1;i<=n;i++){
        s+=(r/t[i])*c[i];
    }
    return s;
}

int main () {
    fscanf(fin, "%lld%lld\n", &n, &m);
    fread(b, 1, 1200020, fin);
    // ia tot continutul fisierului si il pune ca secventa de simboluri
    // in vectorul de caractere b, incepand cu pozitia 0 si la final pune caracterul cu codul 0
    //for(i=1;i<=n;i++){
    //    fscanf(fin, "%lld%lld", &c[i], &t[i]);
    //    t[i]*=2;
    //}
    int val = 0;
    int p = 0, j = 0;
    for (i=0; b[i] != 0; i++) {
        if (b[i] >= '0' && b[i] <= '9') {
            val = val * 10 + b[i]-'0';
        } else
            if (b[i-1] >= '0' && b[i-1] <= '9') {
                if (p == 0) {
                    c[++j] = val;
                    p = 1;
                    val = 0;
                } else {
                    t[j] = val*2;
                    val = 0;
                    p = 0;
                }
            }

    }

    st=1;
    dr=(m/c[1] + 1)*t[1];
    while(st<=dr){
        mij=(st+dr)/2;
        if(maxtrans(mij)>=m)
            dr=mij-1;
        else
            st=mij+1;
    }

    //fout<<st<<" ";
    for(i=1;i<=n;i++){
        trans[i]=(st/t[i])*c[i];
    }
    sort(trans+1,trans+n+1);
    k=n;
    s = 0;
    while(s<m){
        s += trans[k];
        k--;
        nr++;
    }
    fprintf(fout,"%lld %lld\n", st, nr);
    return 0;
}