Cod sursa(job #3348497)

Utilizator Gabriel_DaescuDaescu Gabriel Florin Gabriel_Daescu Data 22 martie 2026 12:55:01
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <fstream>
#include <vector>
#define NMAX 105
#define LMAX 105
using namespace std;
ifstream  fin("lapte.in");
ofstream fout("lapte.out");
int N,L,a[NMAX],b[NMAX],dp[NMAX][LMAX];
vector<int> solA(NMAX),solB(NMAX);
struct nod
{
    int prev,x;
}t[NMAX][LMAX];

void citire()
{
    fin>>N>>L;

    for(int i=1; i<=N; i++)
    {
        fin>>a[i]>>b[i];
    }
}

int ok(int T)
{
   for(int i=0; i<=N; i++)
   {
       for(int j=0; j<=L; j++)
       {
           dp[i][j]=-1;
       }
   }

    dp[0][0]=0;
    for(int i=1; i<=N; i++)
    {
        for(int j=0; j<=L; j++)
        {
            if(dp[i-1][j]==-1)
            {
                continue;
            }

            for(int x=0; x*a[i]<=T; x++)
            {
                int y=(T-x*a[i])/b[i];

                int nj=min(L,j+x);
                int nb=dp[i-1][j]+y;

                if(nb>dp[i][nj])
                {
                    dp[i][nj]=nb;
                    t[i][nj]={j,x};
                }
            }
        }
    }

    return dp[N][L]>=L;
}

void drum(int i, int j, int T)
{
    if(i==0)
    {
        return;
    }

    drum(i-1,t[i][j].prev,T);

    solA[i]=t[i][j].x;
    solB[i]=(T-solA[i]*a[i])/b[i];
}

int main()
{
    citire();

    int p1,p2,pmijl,ans;
    p1=ans=0;
    p2=10000;

    while(p1<=p2)
    {
        pmijl=(p1+p2)/2;

        if(ok(pmijl))
        {
            ans=pmijl;
            p2=pmijl-1;
        }
        else
        {
            p1=pmijl+1;
        }
    }

    ok(ans);

    fout<< ans << "\n";

    drum(N,L,ans);

    for(int i=1; i<=N; i++)
    {
        fout<< solA[i] << " " << solB[i] << "\n";
    }

    return 0;
}