Cod sursa(job #1608388)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 22 februarie 2016 00:52:53
Problema Garaj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cctype>

using namespace std;

const int BUFF_SIZE = 100;
const int N = 100100;

struct Truck {
    int t;
    int c;
    int pond;

    bool operator <(const Truck &other) const {
        return pond > other.pond;
    }
};

int n, m;
char buff[BUFF_SIZE];
Truck tr[N];

inline int parse(int &i) {
    int val = 0;
    while(isdigit(buff[i])) {
        val = val * 10 + buff[i++] - '0';
    }
    i++;
    return val;
}

bool ok(int time) {
    int i;
    long long sum;

    sum = 0;
    for(i = 1; i <= n; i++) {
        sum += 1LL * (time / (2 * tr[i].t)) * tr[i].c;
        if(sum >= m) {
            return 1;
        }
    }
    return 0;
}

int main() {
    freopen("garaj.in", "r", stdin);
    freopen("garaj.out", "w", stdout);

    int i, j, lo, hi, med, sum, time;

    scanf("%d %d\n", &n, &m);

    hi = 0;
    for(i = 1; i <= n; i++) {
        gets(buff);
        tr[i].c = parse(j = 0);
        tr[i].t = parse(j);
        hi = max(hi, (m / tr[i].c + 1) * 2 * tr[i].t);
    }

    lo = 1;
    while(lo <= hi) {
        med = (lo + hi) >> 1;
        if(ok(med)) {
            hi = med - 1;
        }
        else {
            lo = med + 1;
        }
    }

    time = hi + 1;
    for(i = 1; i <= n; i++) {
        tr[i].pond = (time / (2 * tr[i].t)) * tr[i].c;
    }
    sort(tr+1, tr+n+1);

    i = 1;
    sum = 0;
    while(sum < m) {
        sum += tr[i].pond;
        i++;
    }
    i--;

    printf("%d %d\n", time, i);
    return 0;
}