Cod sursa(job #1219884)

Utilizator mucenic_b101Bogdan Mucenic mucenic_b101 Data 15 august 2014 15:48:47
Problema Garaj Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <cstdio>
#include <algorithm>
#define MAXN 100000
#define MAXC 1000
#define MAXT 1000
#define MAXM 1000000000
#define MAXTIMECHECK 40000000

using namespace std;

struct cam {
    int t, c, b;
};

cam trucks[MAXN];
int n, m;

bool dsb(cam x, cam y) {
    return x.b > y.b;
}

inline long long nrb(int time, int ind) {
    long long k = trucks[ind].c * (time / (2 * trucks[ind].t));
    return k;
}

inline bool check(int time) {
    long long bottles = 0;

    for (int i = 0 ; i < n  && bottles < m ; ++i)
        bottles += nrb(time, i);

    if (bottles < m)
        return false;

    return true;
}

int main () {
    FILE *f, *g;
    f = fopen("garaj.in", "r");
    g = fopen("garaj.out", "w");

    fscanf(f, "%d%d", &n, &m);

    for (int i = 0 ; i < n ; ++i)
        fscanf(f, "%d%d", &trucks[i].c, &trucks[i].t);

    long long start = 1, stop = MAXTIMECHECK, mid;
    long long tm;

    while (stop - start > 1) {
        mid = (start + stop) >> 1;
        if (check(mid))
            stop = mid, tm = mid;
        else
            start = mid;
    }

    int tmin = tm;

    for (int i = 0 ; i < n ; ++i)
        trucks[i].b = nrb(tmin, i);

    sort(trucks, trucks + n, dsb);

    long long bottles = 0;
    int i = 0, nrmin = 0;

    while (bottles < m ) {
        ++nrmin;
        bottles += trucks[i++].b;
    }

    fprintf(g, "%d %d\n", tmin, nrmin);

    fclose(f);
    fclose(g);

    return 0;

}