Cod sursa(job #3293404)

Utilizator Andrei1209Andrei Mircea Andrei1209 Data 11 aprilie 2025 17:04:04
Problema Lapte Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.34 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);
    for ( i = 1; i <= n; ++i )
        dp[i][0] = dp[i - 1][0] + T / t2[i];
    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 = 0; x <= j && x * t1[i] <= T; ++x )
            {
                y = (T - x * t1[i]) / t2[i];
                if ( dp[i][j] < dp[i - 1][j - x] + y )
                {
                    dp[i][j] = dp[i - 1][j - x] + y;
                    tata[i][j] = {i - 1,j - x};
                }
            }
        }
    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;
    }
    pair <int, int> nxt = tata[ind.first][ind.second];
    solution[ind.first] = {ind.second - nxt.second, dp[ind.first][ind.second] - dp[nxt.first][nxt.second]};

    for ( i = 1; i <= n; ++i )
        fout << solution[i].first << " " << solution[i].second << "\n";
    return 0;
}