Cod sursa(job #3305339)

Utilizator Cyb3rBoltSbora Ioan-David Cyb3rBolt Data 31 iulie 2025 20:34:28
Problema Lapte Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int n, need;
int prodA[110], prodB[110], ramas[110];
int solA[110], solB[110];

struct Iris {
    int a, b;
    int index;
}v[110];

inline int cmp(Iris a, Iris b) {
    if(a.a == b.a) return a.b < b.b;
    return a.a > b.a;
}

inline int check(int x) {
    int cntA = 0, cntB = 0;
    for(int i=1; i<=n; i++) {
        prodA[i] = x / v[i].a;
        cntA += prodA[i];
        ramas[i] = x % v[i].a;
    }
    if(cntA < need) return 0;
    for(int i=1; i<=n; i++) {
        prodB[i] = ramas[i] / v[i].b;
        cntB += prodB[i];
        ramas[i] %= v[i].b;
    }
    if(cntB >= need) return 1;
    for(int i=1; i<=n && cntB < need; i++) {
        int schimbMax = (prodA[i] * v[i].a + ramas[i]) / v[i].b;
        if(cntB + schimbMax < need) {
            ramas[i] = (prodA[i] * v[i].a + ramas[i]) % v[i].a;
            cntA -= prodA[i], prodA[i] = 0;
            prodB[i] = schimbMax, cntB += prodB[i];
            prodA[i] = ramas[i] / v[i].a, cntA += prodA[i];
            ramas[i] %= v[i].a;
        }
        else {
            int dif = need - cntB;
            int take = (dif * v[i].b - ramas[i]) / v[i].a;
            if((dif * v[i].b - ramas[i]) % v[i].a != 0) take++;
            prodA[i] -= take, cntA -= take;
            prodB[i] = dif, cntB = need;
            ramas[i] = (dif * v[i].b - ramas[i]) % v[i].a;
            prodA[i] += ramas[i] / v[i].a, cntA += ramas[i] / v[i].a;
            ramas[i] %= v[i].a;
        }
        if(cntA < need) return 0;
    }
    if(cntA < need || cntB < need) return 0;
    return 1;
}

int main()
{
    fin >> n >> need;
    for(int i=1; i<=n; i++) {
        fin >> v[i].a >> v[i].b;
        v[i].index = i;
    }
    sort(v+1, v+n+1, cmp);
    int st = 1, dr = 2e9, sol = -1;
    while(st <= dr) {
        int mid = (st + dr) / 2;
        if(check(mid)) sol = mid, dr = mid - 1;
        else st = mid + 1;
    }
    fout << sol << '\n';
    check(sol);
    for(int i=1; i<=n; i++) {
        solA[v[i].index] = prodA[i];
        solB[v[i].index] = prodB[i];
    }
    for(int i=1; i<=n; i++) fout << solA[i] << " " << solB[i] << '\n';

    return 0;
}