Cod sursa(job #2695120)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 11 ianuarie 2021 20:37:33
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb

#include <fstream>

using namespace std;

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

const int nmax=100,lmax=100,tmax=100;

int d[nmax+1][lmax+1],a[nmax+1],b[nmax+1],n,r[nmax+1][lmax+1];

int lapte(int t)
{
    for(int i=0; i<=n; i++)
    {
        for(int j=0; j<=lmax; j++)
        {
            d[i][j]=-nmax*nmax;
        }
    }
    d[0][0]=0;
    for(int i=0; i<=n-1; i++)
    {
        for(int j=0; j<=lmax; j++)
        {
            for(int k=0; k*a[i+1]<=t; k++)
            {
                if(j+k<=lmax&&d[i+1][j+k]<d[i][j]+(t-k*a[i+1])/b[i+1])
                {
                    d[i+1][j+k]=d[i][j]+(t-k*a[i+1])/b[i+1];
                    r[i+1][j+k]=k;
                }
            }
        }
    }
    int sol=-1;
    for(int j=0; j<=lmax; j++)
    {
        int aux=j;
        if(d[n][j]<aux)
        {
            aux=d[n][j];
        }
        if(aux>sol)
        {
            sol=aux;
        }
    }
    return sol;
}

int main()
{
    int l;
    fin>>n>>l;
    for(int i=n; i>=1; i--)
    {
        fin>>a[i]>>b[i];
    }
    int t2=1;
    while(2*t2<=tmax)
    {
        t2*=2;
    }
    int sol=tmax+1;
    for(int i=t2; i>0; i/=2)
    {
        if(sol-i>0&&lapte(sol-i)>=l)
        {
            sol-=i;
        }
    }
    fout<<sol<<"\n";
    lapte(sol);
    int aux=l;
    for(int i=n; i>=1; i--)
    {
        fout<<r[i][aux]<<" ";
        fout<<(sol-r[i][aux]*a[i])/b[i]<<"\n";
        aux=aux-r[i][aux];
    }
    return 0;
}