Cod sursa(job #2868720)

Utilizator daria_pDaria Popescu daria_p Data 11 martie 2022 09:45:05
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream>

using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int n,i,j,mij,st,dr,l,va[105],vb[105],sol,dp[105][105],xi,a[105][105];
struct answear
{
    int x,y;
}ans[105];
int valid(int t)
{
    int i,xi,yi,j;
    for (i=0; i<=100; i++)
    {
        for (j=0; j<=100; j++)
        {
            dp[i][j]=-100;
        }
    }
    dp[0][0]=0;
    for(i=1; i<=n; i++)
    {
        for(j=0; j<=l; j++)
        {
            for(xi=0; xi*va[i]<=t && xi<=j; xi++)
            {
                dp[i][j]=max(dp[i][j],dp[i-1][j-xi]+(t-va[i]*xi)/vb[i]);
            }
        }
    }
    if (dp[n][l]>=l) return 1;
    else return 0;
}
int main()
{
    fin >>n>>l;
    for (i=1; i<=n; i++)
    {
        fin >>va[i]>>vb[i];
    }
    st=1;
    dr=100;
    while (st<=dr)
    {
        mij=(st+dr)/2;
        if (valid(mij)==1)
        {
            sol=mij;
            dr=mij-1;
        }
        else st=mij+1;
    }
    fout <<sol<<'\n';
    for (i=0;i<=n;i++)
    {
        for (j=0;j<=l;j++)
        {
            dp[i][j]=-100;
        }
    }
    dp[0][0]=0;
    for(i=1;i<=n;i++)
    {
        for(j=0;j<=l;j++)
        {
            for(xi=0; xi*va[i]<=sol && xi<=j; xi++)
            {
                if(dp[i][j]<dp[i-1][j-xi]+(sol-va[i]*xi)/vb[i])
                {
                    a[i][j]=j-xi;
                    dp[i][j]=max(dp[i][j],dp[i-1][j-xi]+(sol-va[i]*xi)/vb[i]);
                }
            }
        }
    }
    for(i=n;i>=1;i--)
    {
        ans[i].x=l-a[i][l];
        ans[i].y=(sol-ans[i].x*va[i])/vb[i];
        l=a[i][l];
    }
    for (i=1;i<=n;i++)
    {
        fout <<ans[i].x<<" "<<ans[i].y<<'\n';
    }
    return 0;
}