Cod sursa(job #2793081)

Utilizator Darius1414Dobre Darius Adrian Darius1414 Data 2 noiembrie 2021 20:20:57
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <iostream>
#include <fstream>
#include <algorithm>

#define nmax 105
using namespace std;
int a[nmax],b[nmax],n,l,ba[nmax][nmax],bb[nmax][nmax];

int solve (int t)
{
    int dp[nmax][nmax];
    // dp[i][j] = nr maxim de litri de B pe care poti sa ii bei cu primii i participanti
    // daca bei j litri de A
    // Daca dp[3][5] = 2, inseamna ca cu primii 3 participanti,
    // pentru 5 litri de A bauti, mai poti sa bei maxim 2 litri de B

    for (int i=0;i<=n;i++)
        for (int j=0;j<=l;j++)
            dp[i][j] = -(1<<20);
    dp[0][0] = 0;

    for (int i=1;i<=n;i++)
        for (int la=0;la * a[i]<=t;la++)
            {
            int lb=(t-a[i]*la) / b[i];
            for (int j=0;j<=l-la;j++)
                {
                // dp[i-1][j] + lb => dp[i][j+la]
                if (dp[i-1][j] + lb > dp[i][j + la])
                    {
                    dp[i][j + la] = dp[i-1][j] + lb;
                    ba[i][j + la] = la;
                    bb[i][j + la] = lb;
                    }
                }
            }
    return dp[n][l] >= l;
}
// (i - 1, j, dp[i - 1][j])
// (i, j + la, dp[i - 1][j] + lb)
//


int main()
{
    ifstream f ("lapte.in");
    ofstream g ("lapte.out");
    f>>n>>l;
    int i,j,st,mid,dr,sol;
    for (i=1;i<=n;i++)
    {
        f >> a[i] >> b[i];
    }
    st=1;
    dr=20000;
    while (st<=dr)
    {
        mid=(st+dr)/2;
        if (solve(mid))
        {
            sol=mid;
            dr=mid-1;
        }
        else
        {
            st=mid+1;
        }
    }
    g<<sol << '\n';
    solve(sol);

    i = n, j = l;
    int p[nmax], q[nmax];
    while (i) {
        //dp[i][j] (prima data esti in dp[n][l])
        //ba[i][j] litri de a, bb[i][j] litri de b
        p[i] = ba[i][j];
        q[i] = bb[i][j];
        j-= ba[i][j];
        i--;
    }
    for (int i = 1; i <= n; i++) {
        g << p[i] << ' ' << q[i] << '\n';
    }
}