Cod sursa(job #3321213)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 8 noiembrie 2025 16:07:57
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <bits/stdc++.h>
#define MOD 998244353
#define EPS 0.000000001
#define loop(i, a, b) for(int i = a; i < b; i++)
#define loop_step(i, a, b, c) for(int i = a; i < b; i += c)
#define loop_inv(i, a, b) for(int i = a; i > b; i--)
#define pb push_back
#define val first
#define lazy second
#define enter cout << "\n"
typedef long long ll;
using namespace std;

void read(){}

void write(){}

template <typename T, typename ...Args>
void write(T& first, Args&... args){
    cout << first << " ";
    write(args...);
}

template <typename T, typename ...Args>
void read(T& first, Args&... args){
    cin >> first;
    read(args...);
}
struct person{
    int La, Lb, ind;
};;

bool greedy(int x, int n, int l, vector <person> &v, vector <person> &comp){
    int Qa = l, Qb = l;
    loop(i, 1, n + 1){
        comp[i].La = comp[i].Lb = 0;
    }
    loop(i, 1, n + 1){
        comp[i].La = min(Qa, x / v[i].La);
        comp[i].Lb = (x - v[i].La  * comp[i].La) / v[i].Lb;
        Qa -= comp[i].La;
        Qb -= comp[i].Lb;
    }
    return Qa <= 0 && Qb <= 0;
}

int main() {
    int n, l;
    freopen("lapte.in", "r", stdin);
    freopen("lapte.out", "w", stdout);
    read(n, l);
    vector <person> v(n + 1), comp(n + 1);
    loop(i, 1, n + 1){
        read(v[i].La, v[i].Lb);
        v[i].ind = i;
    }
    sort(v.begin() + 1, v.begin() + 1 + n, [](const person &x, const person &y){
        return x.La - x.Lb < y.La - y.Lb;
    });
    int pas = 1 << 8, sol = 0;
    while(pas){
        if(!greedy(sol + pas, n, l, v, comp)){
            sol += pas;
        }
        pas /= 2;
    }
    ++sol;
    greedy(sol, n, l,v, comp);
    loop(i, 1, n + 1){
        comp[i].ind = v[i].ind;
    }
    sort(comp.begin() + 1, comp.begin() + 1 + n, [](const person &x, const person &y){
        return x.ind < y.ind;
    });
    write(sol);
    enter;
    loop(i, 1, n + 1){
        write(comp[i].La, comp[i].Lb);
        enter;
    }

    return 0;
}