Cod sursa(job #3129581)

Utilizator TeodoraMaria123Serban Teodora Maria TeodoraMaria123 Data 14 mai 2023 23:22:10
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <bits/stdc++.h>

using namespace std;

#define pb push_back

const int MAX_N = 100;
const int MAX_L = 100;
const int inf = 1e9;

int n, L, timp;
int dp[MAX_N + 1][MAX_L + 1], ans[MAX_N + 1][MAX_L + 1];
vector <int> a, b;
vector <pair <int, int> > sol, sol1;

void init()
{
    for(int i = 0; i <= n; i ++)
        for(int j = 0; j <= L; j ++)
            dp[i][j] = -inf, ans[i][j] = 0;
}

void rebuildPath(int Time, vector <pair <int, int> > &sol1)
{
    int j = L, total = L;
    for(int i = n; i >= 1; i --)
    {
        sol1.pb({(Time - b[i] * (j - ans[i][j])) / a[i], j - ans[i][j]});
        j = ans[i][j];
    }
}

bool ok(int Time, vector <pair <int, int> > &sol1)
{
    init();
    sol1.clear();
    int capat = Time / b[1];
    for(int j = 0; j <= capat; j ++ )
        dp[1][j] = (Time - b[1] * j)/a[1];
    for(int i = 2; i <= n; i ++)
    {
        dp[i][0] = dp[i - 1][0] + Time / a[i];
//        int capat = Time / b[i]; ori asa ori initializat cu -inf sa se opreasca
        for(int j = 1; j <= L; j ++)
        {
            int inceput = max(0, j - Time / b[i]);
            for(int k = inceput; k <= j; k ++)
                if(dp[i - 1][k] + (Time - b[i] * (j - k))/a[i] > dp[i][j])
                {
                    dp[i][j] = dp[i - 1][k] + (Time - b[i] * (j - k))/a[i];
                    ans[i][j] = k;
                }
        }
    }

    rebuildPath(Time, sol1);
    return dp[n][L] >= L;
}

int bs()
{
    int st = 1, dr = 200, med, last = -1;
    while(st <= dr)
    {
        med = (st + dr) / 2;
        if(ok(med, sol1))
        {
            dr = med - 1;
            last = med;
            sol = sol1;
        }
        else
            st = med + 1;
    }
    return last;
}

int main()
{
    ios_base :: sync_with_stdio(0);
    cin.tie(0);

    freopen("lapte.in", "r", stdin);
    freopen("lapte.out", "w", stdout);

    cin >> n >> L;
    a.resize(n + 1);
    b.resize(n + 1);
    for(int i = 1; i <= n; i ++)
        cin >> a[i] >> b[i];

    int timp =  bs();
    cout << timp << "\n";

    for(auto it = sol.rbegin(); it != sol.rend(); it ++)
        cout << it -> first << " " << it -> second << "\n";
    return 0;
}