Cod sursa(job #1608363)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 22 februarie 2016 00:20:15
Problema Garaj Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 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;

    bool operator <(const Truck &other) const {
        return (double)c / (double)t - (double)other.c / (double)other.t > 1e-6;
    }
};

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;
}

int count_trucks(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 i;
        }
    }
    return -1;
}

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

    int i, j, lo, hi, med, cnt, best_time, best_cnt;

    scanf("%d %d\n", &n, &m);
    for(i = 1, hi = 0; 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);
    }
    sort(tr + 1, tr + n + 1);

    lo = 1;
    while(lo <= hi) {
        med = (lo + hi) >> 1;
        cnt = count_trucks(med);
        if(cnt == -1) {
            lo = med + 1;
        }
        else {
            hi = med - 1;
            best_time = med;
            best_cnt = cnt;
        }
    }

    printf("%d %d\n", best_time, best_cnt);
    return 0;
}