Cod sursa(job #2880160)

Utilizator ana_madalina_18Radu Ana Madalina ana_madalina_18 Data 29 martie 2022 14:49:35
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int n, l;
struct elem
{
    int lapte_A, lapte_B;
};
struct elem_dp
{
    int val, lapte_A;
};
elem timp[105];
elem ras[105];
int rasp=1e9;
elem_dp dp[105][105];
bool verif(int x)
{
    for(int i=0;i<=l;i++)
    {
        for(int j=0;j<=n;j++)
        {
            dp[i][j].val=-1;
        }
    }
    dp[0][0].val=0;
    for(int ind_pers=1;ind_pers<=n;ind_pers++)
    {
        for(int st=0;st<=l;st++)
        {
            for(int st2=0;st2<=st;st2++)
            {
                if(dp[st2][ind_pers-1].val==-1)
                {
                    continue;
                }
                int timp_lapte_A=(st-st2)*timp[ind_pers].lapte_A;
                if(x<timp_lapte_A)
                {
                    continue;
                }
                int timp_lapte_B=x-timp_lapte_A;
                int lapte_baut=timp_lapte_B/timp[ind_pers].lapte_B;
                if(dp[st][ind_pers].val<dp[st2][ind_pers-1].val+lapte_baut)
                {
                    dp[st][ind_pers].val=dp[st2][ind_pers-1].val+lapte_baut;
                    dp[st][ind_pers].lapte_A=st-st2;
                }
            }
        }
    }
    //cout<<l<<' '<<n<<' '<<x<<' '<<dp[l][n]<<endl;
    return dp[l][n].val>=l;
}
void caut_binar_timp_min()
{
    int st=0, dr=105;
    int mij;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(verif(mij))
        {
            rasp=min(rasp,mij);
            dr=mij-1;
        }
        else
        {
            st=mij+1;
        }
    }
}
int main()
{
    fin>>n>>l;
    for(int i=1;i<=n;i++)
    {
        int x, y;
        fin>>x>>y;
        timp[i].lapte_A=x;
        timp[i].lapte_B=y;
    }
    caut_binar_timp_min();
    fout<<rasp<<'\n';
    verif(rasp);
    for(int i=1;i<=n;i++)
    {
        //dp[l][n] --> dp[l-dp[l][n].lapte_A][n-1]
        //fout<<dp[l][i].lapte_A<<' '<<dp[l][i].lapte_B<<'\n';
    }
    int lap_A=l;
    for(int i=n;i>0;i--)
    {
        ras[i].lapte_A=dp[lap_A][i].lapte_A;
        lap_A-=ras[i].lapte_A;
        int litr_B=(rasp-ras[i].lapte_A*timp[i].lapte_A)/timp[i].lapte_B;
        ras[i].lapte_B=litr_B;
    }
    for(int i=1;i<=n;i++)
    {
        fout<<ras[i].lapte_A<<' '<<ras[i].lapte_B<<'\n';
    }
    return 0;
}