Cod sursa(job #3309157)

Utilizator Lex._.Lex Guiman Lex._. Data 1 septembrie 2025 22:02:14
Problema Lapte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.62 kb
#include <bits/stdc++.h>
#define NMAX 101
using namespace std;

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

int timp_a[NMAX], timp_b[NMAX];
int dp[2][NMAX]; ///fie j = numarul de litri de lapte A baut in timpul T, atunci dp[i%2][j] = numarul maxim de litri de lapte B care pot fi bauti in timpul T
pair<int, int> ult_poz[NMAX][NMAX], ult_val[NMAX][NMAX];

int litri_a[NMAX], litri_b[NMAX]; ///cati litri a baut fiecare persoana

bool posibil(int t, int n, int l) ///verifica daca se pot bea l litri din fiecare lapte in timpul t
{
    for(int j=0; j<=l; j++) dp[0][j]=0, dp[1][j]=0;

    for(int i=1; i<=n; i++)
    {
        for(int l_a=0; l_a*timp_a[i]<=t; l_a++) ///l_a = litri bauti din laptele A
        {
            int l_b = (t - l_a*timp_a[i]) / timp_b[i]; ///l_b = litri bauti din laptele B

            //out << i << "   " << l_a << " " << l_b << "\n";

            for(int j=l; j>=l_a; j--)
            {
                dp[i%2][j]=dp[(i-1)%2][j];
                if(dp[(i-1)%2][j-l_a]+l_b > dp[i%2][j])
                {
                    dp[i%2][j] = dp[(i-1)%2][j-l_a] + l_b;
                    ult_poz[i][j]={i-1, j-l_a};
                    ult_val[i][j]={j, l_b};
                }
            }
        }
    }

    //out << t << "        \t"; for(int j=1; j<=l; j++) out << dp[n%2][j] << "\t\t"; out << "\n\n";

    if(dp[n%2][l]>=l)
    {

        /*for(int i=1; i<=n; i++)
        {
            for(int j=0; j<=l; j++) out << ult_poz[i][j].first << " " << ult_poz[i][j].second << "   \t"; out << "\n";
        } out << "\n";*/

        pair<int, int> poz={n, l};
        for(int i=n; i>=1; i--)
        {
            //out << poz.first << " " << poz.second << "\n";
            litri_a[i]=ult_val[poz.first][poz.second].first;
            litri_b[i]=ult_val[poz.first][poz.second].second;
            poz=ult_poz[poz.first][poz.second];
        }

        return 1;
    }
    else
    {
        return 0;
    }
}

int cautare_binara(int n, int l) ///il cautam binar pe t
{
    int st=0, dr=NMAX, t=dr;
    while(st<=dr)
    {
        int mij=st+(dr-st)/2;
        if(posibil(mij, n, l))
        {
            t=mij;
            dr=mij-1;
        }
        else
        {
            st=mij+1;
        }
    }
    return t;
}

int main()
{
    int n, l;
    in >> n >> l;
    for(int i=1; i<=n; i++)
    {
        in >> timp_a[i] >> timp_b[i];
    }
    out << cautare_binara(n, l) << "\n";
    //posibil(18, n, l);
    for(int i=1; i<=n; i++) ///afisam solutia
    {
        out << litri_a[i] << " " << litri_b[i] << "\n";
    }

    return 0;
}