Cod sursa(job #2829551)

Utilizator DordeDorde Matei Dorde Data 8 ianuarie 2022 18:47:38
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include<bits/stdc++.h>
#define pii pair<int,int>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int const N = 101;
int n , l;
pair<pii , int> v[N];
pii sol[N];
bool c1(pair<pii , int> A , pair<pii , int> B){
    return A.first.first - A.first.second < B.first.first - B.first.second;
}
bool c2(pair<pii , int> A , pair<pii , int> B){
    return A.second < B.second;
}
bool eval(pii x[] , int t){
    int sA = l , sB = 0;
    for(int i = 1 ; i <= n ; ++ i){
        int x = min(sA , t / v[i].first.first);
        sA -= x;
        sol[i].first = x;
        x = max(0 , (t - x * v[i].first.first) / v[i].first.second);
        sB += x;
        sol[i].second = x;
    }
    return !sA && sB >= l;
}
int main()
{
    fin >> n >> l;
    for(int i = 1 ; i <= n ; ++ i){
        fin >> v[i].first.first >> v[i].first.second;
        v[i].second = i;
    }
    sort(v + 1 , v + 1 + n , c1);
    int p = (1 << 6) , r = 0;
    while(p){
        if(!eval(sol , p + r))
            r += p;
        p >>= 1;
    }
    ++ r;
    eval(sol , r);
    for(int i = 1 ; i <= n ; ++ i)
        v[i].first = sol[i];
    sort(v + 1 , v + 1 + n , c2);
    fout << r << '\n';
    for(int i = 1 ; i <= n ; ++ i)
        fout << v[i].first.first << ' ' << v[i].first.second << '\n';
    return 0;
}