Cod sursa(job #2811437)

Utilizator Edyci123Bicu Codrut Eduard Edyci123 Data 2 decembrie 2021 11:48:58
Problema Lapte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <bits/stdc++.h>
#define DIM 105

using namespace std;

ifstream f("lapte.in");
ofstream g("lapte.out");

int n, m, dp[DIM][DIM], tata[DIM][DIM], x[DIM], y[DIM], litri, ans;

bool ok(int t)
{
    bool ok1 = 0;
    for (int i = 1; i <= n; i++)
        for (int j = 0; j <= litri; j++)
            dp[i][j] = -1;


    for (int j = 0; j < min(litri, t / x[1]); j++)
    {
        dp[1][j] = (t - j * x[1]) / y[1];
        tata[1][j] = j;
    }

    for (int i = 2; i <= n; i++)
        for (int j = 0; j <= min(litri, t / x[1]); j++)
            for (int k = 0; k <= litri - j; k++)
                if (dp[i - 1][k] != -1 && dp[i][j + k] < dp[i - 1][k] + (t - j * x[i]) / y[i])
                {
                    dp[i][j + k] = dp[i - 1][k] + (t - j * x[i]) / y[i];
                    tata[i][j + k] = j;
                    if (dp[i][j + k] >= litri && k + j == litri)
                        ok1 = 1;
                }
    return ok1;
}

void path(int n, int litri)
{
    if(n == 0)
        return ;
    path(n - 1, litri - tata[n][litri]);
    g << tata[n][litri] << " " << (ans - tata[n][litri] * x[n]) / y[n] << "\n";
}

int main()
{
    f >> n >> litri;

    for (int i = 1; i <= n; i++)
        f >> x[i] >> y[i];

    int st = 1, dr = litri * (x[1] + y[1]);

    while (st <= dr)
    {
        int mid = (st + dr) >> 1;

        if (ok(mid))
            dr = mid - 1;
        else
            st = mid + 1;
    }
    ans = st;

    ok(ans);

    g << ans << "\n";

    path(n, litri);

    return 0;
}