Cod sursa(job #1573193)

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

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

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

char b[1200020];

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

int main () {
    fscanf(fin, "%d%d\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;
    //}
    dr = 1000000000000000LL;
    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;

                    dr = min(dr, (m/c[j] + 1)*1LL*t[j]);

                    val = 0;
                    p = 0;
                }
            }

    }

    st=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 %d\n", st, nr);
    return 0;
}