Cod sursa(job #2939115)

Utilizator indianu_talpa_iuteTisca Catalin indianu_talpa_iute Data 13 noiembrie 2022 00:30:20
Problema Lapte Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <bits/stdc++.h>
#define MAXN 100

using namespace std;

ifstream fin("lapte.in");
ofstream fout("lapte.out");

struct Pers {
    int a, b, i;
};

int n, l;
Pers pers[MAXN];
pair<int, int> solve[MAXN];

bool check(int time, pair<int, int> currentSolve[]) {
    int quantityA = l, quantityB = l;
    for (int i = 0; i < n; i++) {
        int difB = min(quantityB, time / pers[i].b);
        int difA = (time - difB * pers[i].b) / pers[i].a;
        quantityA -= difA;
        quantityB -= difB;
        currentSolve[pers[i].i] = {difA, difB};
    }
    return quantityA <= 0 && quantityB <= 0;
}

int main() {
    int minTime = INT_MAX;
    pair<int, int> currentSolve[MAXN];

    fin >> n >> l;
    for (int i = 0; i < n; i++) {
        fin >> pers[i].a >> pers[i].b;
        pers[i].i = i;
    }

    // sorting for greedy checkinn
    sort(pers, pers + n, [](Pers a, Pers b) {
        return a.a / a.b > b.a / b.b;
    });

    int lo = 1, hi = l;
    while (lo <= hi) {
        int mid = lo + (hi - lo) / 2;
        if (check(mid, currentSolve)) {
            hi = mid - 1;
            for (int i = 0; i < n; i++)
                solve[i] = currentSolve[i];
            minTime = mid;
        } else
            lo = mid + 1;
    }

    fout << minTime << '\n';
    for (int i = 0; i < n; i++)
        fout << solve[i].first << ' ' << solve[i].second << '\n';
    return 0;
}