Cod sursa(job #3305349)

Utilizator Cyb3rBoltSbora Ioan-David Cyb3rBolt Data 31 iulie 2025 21:30:27
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
#define int long long
int n, need;
int dp[103][103]; ///dp[i][j] = cantitatea maxima de lapte 2 ce o bea primele i pers pt a bea si j lapte 1
int last[103][103];
int solA[110], solB[110];

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

inline int check(int x) {
    for(int i=0; i<=n; i++)
        for(int j=0; j<=need; j++) dp[i][j] = -1;
    dp[0][0] = 0;
    for(int i=1; i<=n; i++) {
        for(int j=0; j<=need; j++) {
            for(int k=0; k<=j && k * v[i].a <= x; k++) {
                if(dp[i - 1][j - k] >= 0) { ///verific daca pot sa beau j - k lapte 1 cu primele i - 1 persoane si sa mi ramana si de lapte 2
                    ///o sa beau cu persoana 1 k litri de lapte1 => k * v[i].a timp
                    ///=> imi mai raman x - k * v[i].a timp pt lapte2 sa cresc in dp[i][j]
                    int take = dp[i - 1][j - k] + (x - k * v[i].a) / v[i].b;
                    if(take > dp[i][j]) dp[i][j] = take, last[i][j] = k;
                }
            }
        }
    }
    return dp[n][need] >= need;
}

signed main()
{
    fin >> n >> need;
    for(int i=1; i<=n; i++) {
        fin >> v[i].a >> v[i].b;
        v[i].index = i;
    }
    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=n; i>=1; i--) {
        solA[i] = last[i][need];
        solB[i] = (sol - last[i][need] * v[i].a) / v[i].b;
        need -= last[i][need];
    }
    for(int i=1; i<=n; i++) fout << solA[i] << " " << solB[i] << '\n';

    return 0;
}