Cod sursa(job #1550422)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 13 decembrie 2015 18:07:56
Problema Garaj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 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);

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

    return n + 1;
}

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

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

    return _m <= 0;
}

class InputReader {
    public:
        InputReader() {}
        InputReader(const char *file_name) {
            input_file = fopen(file_name, "r");
            cursor = 0;
            fread(buffer, SIZE, 1, input_file);
        }
        inline InputReader &operator >>(int &n) {
            while(buffer[cursor] < '0' || buffer[cursor] > '9') {
                advance();
            }
            n = 0;
            while('0' <= buffer[cursor] && buffer[cursor] <= '9') {
                n = n * 10 + buffer[cursor] - '0';
                advance();
            }
            return *this;
        }
    private:
        FILE *input_file;
        static const int SIZE = 1 << 17;
        int cursor;
        char buffer[SIZE];
        inline void advance() {
            ++ cursor;
            if(cursor == SIZE) {
                cursor = 0;
                fread(buffer, SIZE, 1, input_file);
            }
        }
} 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;
}