Cod sursa(job #1550416)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 13 decembrie 2015 18:03:27
Problema Garaj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <fstream>
#include <algorithm>
#include <utility>

#define lint long long int
using namespace std;

const int NMAX = 100005;

int n, m;
struct camion {
    int c, t;
    lint val;
} v[NMAX];

bool operator<(const camion &a, const camion &b) {
    return a.val > b.val;
}

int print_ans(int time) {
    for (int i = 1; i <= n; ++ i)
        v[i].val = v[i].c * (time / (2 * v[i].t));
    sort(v + 1, v + n + 1);

    lint _m = m;
    for (int i = 1; i <= n; ++ i)
        _m -= v[i].val;

    return _m <= 0;
}

bool ok_ans(int time) {
    for (int i = 1; i <= n; ++ i)
        v[i].val = v[i].c * (time / (2 * v[i].t));
    sort(v + 1, v + n + 1);

    int _m = m;
    for (int i = 1; i <= n; ++ i) {
        _m -= v[i].val;
        if (_m <= 0)
            return i;
    }

    return n + 1;
}

ifstream cin("garaj.in");
ofstream cout("garaj.out");

void read() {
    cin >> n >> m;
    for (int i = 1; i <= n; ++ i)
        cin >> v[i].c >> v[i].t;
}

void solve() {
    int st = 1;
    int dr = 1000000000;
    int mijl;
    int ans = dr + 1;

    while (st <= dr) {
        mijl = (st + dr) / 2;
        if (ok_ans(mijl)) {
            ans = mijl;
            dr = mijl - 1;
        }
        else
            st = mijl + 1;
    }

    cout << ans << ' ' << print_ans(ans) << '\n';
}

int main()
{
    read();
    solve();

    cin.close();
    cout.close();
    return 0;
}