Cod sursa(job #3334762)

Utilizator AndreiNicolaescuEric Paturan AndreiNicolaescu Data 19 ianuarie 2026 18:50:47
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <bits/stdc++.h>
#define cin ci
#define cout co
using namespace std;
ifstream cin("lapte.in");
ofstream cout("lapte.out");
const int Nmax = 1e2;
int n, l;
vector<vector<pair<int, int>>> dp;
vector<vector<pair<int, int>>> dp_fin;
vector<pair<int, int>> v;
int ok(int time)
{
    dp.assign(n + 5, vector<pair<int ,int>>(l + 5, {-1, 0}));
    dp[0][0] = {0, 0};
    for(int i = 1; i <= n; i++)
        for(int litri = 0; litri <= l; litri ++)
            for(int la = 0; la * v[i].first <= time && la <= litri; la ++)
            {
                int lb = (time - la * v[i].first) / v[i].second;
                if(dp[i - 1][litri - la].first != -1)
                    if(dp[i][litri].first < dp[i - 1][litri - la].first + lb)
                    {
                        dp[i][litri].first = dp[i - 1][litri - la].first + lb;
                        dp[i][litri].second = la;
                    }

            }
    if(dp[n][l].first >= l)
    {
        dp_fin = dp;
        return 1;
    }

    return 0;
}
int main()
{
    cin.tie(0);
    ios_base::sync_with_stdio(0);
    cin >> n >> l;
    dp.assign(n + 5, vector<pair<int, int>>(l + 5, {-1, 0}));
    v.resize(n + 5);
    for(int i = 1; i <= n; i++)
        cin >> v[i].first >> v[i].second;

    int left = 0, right = 104, ans = -1;
    while(left <= right)
    {
        int mij = (left + right) / 2;
        if(ok(mij))
        {
            ans = mij;
            right = mij - 1;
        }
        else left = mij + 1;
    }
    cout << ans << '\n';
    vector<pair<int, int>> retriv;
    int cur = dp_fin[n][l].second;
    int litars = l;
    int i = n;
    while(i)
    {
        int lb = (ans - cur * v[i].first) / v[i].second;
        retriv.push_back({cur, lb});

        litars -= cur;
        cur = dp_fin[i - 1][litars].second;

        i--;
    }
    reverse(retriv.begin(), retriv.end());
    for(auto [i, j] : retriv)
        cout << i << " " << j << '\n';
    return 0;
}