Cod sursa(job #2786453)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 20 octombrie 2021 23:22:34
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <fstream>
#include <cstring>

using namespace std;

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

const int maxN=100, mic = -10000;
struct bautor {
    int a, b;
}v[maxN + 5], c[maxN + 5];

int st, dr, n, L, dp[maxN + 5][maxN + 5], ans=0x3f3f3f3f, lb, la;

bool valid(int t)
{
    dp[0][0]=0;
    for(int j = 1; j <= L; j++)
        dp[0][j] = mic;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 0; j <= L; j++)
        {
            dp[i][j]=mic;
            for(int k = 0; k <= min(j, t/v[i].a); k++)
            {
                int val = (t - (k * v[i].a))/v[i].b;
                dp[i][j] = max(dp[i][j], val + dp[i-1][j-k]);
            }
        }
    }
    /* fout<<t<<'\n';
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= L; j++)
            fout << dp[i][j]<< ' ';
        fout<<'\n';
    } */
    /// fout<<'\n';
    return dp[n][L] >= L;
}

int main()
{
    fin >> n >> L;
    for(int i = 1; i <= n; i++)
        fin >> v[i].a >> v[i].b;
    st = 1;
    dr = 100;
    while(st <= dr)
    {
        int med = (st + dr)/2;
        if(valid(med))
        {
            ans = min(ans, med);
            dr = med - 1;
        }
        else
            st = med + 1;
    }
    fout << ans << '\n';
    valid(ans);
    int la = L, lb = L;
    for(int i = n; i > 0; i--)
    {
        for(int j = 0; j <= min(la, ans/v[i].a); j++)
            {
                int val = (ans - (j * v[i].a))/v[i].b;
                if(dp[i-1][la - j] + val >= lb)
                {
                    c[i].a = j;
                    c[i].b = val;
                    la = la - j;
                    lb = lb - val;
                    break;
                }
            }
    }
    for(int i = 1; i <= n; i++)
        fout<<c[i].a<<' '<<c[i].b<<'\n';
    return 0;
}