Cod sursa(job #3309158)

Utilizator Lex._.Lex Guiman Lex._. Data 1 septembrie 2025 22:08:25
Problema Lapte Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 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
int ult_poz[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
            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]=l_a;
                }
            }
        }
    }

    if(dp[n%2][l]>=l) 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];
    }
    int ans=cautare_binara(n, l); ///raspunsul cerut
    out << ans << "\n";
    posibil(ans, n, l);
    for(int i=n; i>=1; i--)
    {
        litri_a[i]=ult_poz[i][l];
        litri_b[i]=(ans - litri_a[i]*timp_a[i]) / timp_b[i];
        l-=ult_poz[i][l];
    }
    for(int i=1; i<=n; i++) ///afisam solutia
    {
        out << litri_a[i] << " " << litri_b[i] << "\n";
    }

    return 0;
}