Cod sursa(job #3293340)

Utilizator Andrei1209Andrei Mircea Andrei1209 Data 11 aprilie 2025 14:58:14
Problema Lapte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.3 kb
#include <fstream>

using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");

int L, n, t1[105], t2[105], dp[105][105];
pair <int, int> tata[105][105], solution[105];
/// dp[i][j] - cantitatea maxima de lapte 2 pe care o beau primii i copii, a.i sa bea SIGUR j litri de lapte 1
bool verif( int T )
{
    int i, j;
    for ( j = 0; j <= L; ++j )
        dp[1][j] = max((T - j * t1[1]) / t2[1], 0);

    int mint = 1e9;
    for ( i = 1; i <= n; ++i )
    {
        mint = min(mint, t2[i]);
        dp[i][0] = T / mint;
    }
    for ( i = 2; i <= n; ++i )
        for ( j = 1; j <= L; ++j )
        {
            dp[i][j] = 0;
            int x, y;/// x, y - cantitatea de lapte de tip 1 respectiv 2 pe care o bea copilul i
            for ( x = 1; x <= L && x * t1[i] <= T; ++x )
            {
                y = (T - x * t1[i]) / t2[i];
                if ( dp[i][j] < dp[i - 1][max(j - x, 0)] + y )
                {
                    dp[i][j] = dp[i - 1][max(j - x, 0)] + y;
                    tata[i][j] = {i - 1, max(j - x, 0)};
                }
            }
        }
    if ( dp[n][L] >= L )
        return true;
    return false;
}
void afis()
{
    for ( int i = 1; i <= n; ++i, fout << endl )
        for ( int j = 1; j <= L; ++j )
            fout << dp[i][j] << " ";
}
int main()
{
    fin >> n >> L;
    int i;
    for ( i = 1; i <= n; ++i )
        fin >> t1[i] >> t2[i];

    int st = 1, dr = 100, mij, sol = -1;
    while ( st <= dr )
    {
        mij = (st + dr) / 2;
        if ( verif(mij) == true )
        {
            sol = mij;
            dr = mij - 1;
        }
        else
            st = mij + 1;
    }
    fout << sol << '\n';
    bool ceva = verif(sol);
   // afis();
   // fout << "----------------------------------------\n";
    pair <int, int> ind = {n, L};
    for ( i = 1; i <= n; ++i )
    {
        pair <int, int> nxt = tata[ind.first][ind.second];
      //  fout << nxt.first << " " << nxt.second << endl;
        solution[ind.first] = {ind.second - nxt.second, dp[ind.first][ind.second] - dp[nxt.first][nxt.second]};
        ind = nxt;
    }
    //fout << "-----------------------\n";
    for ( i = 1; i <= n; ++i )
        fout << solution[i].first << " " << solution[i].second << "\n";
    return 0;
}