Cod sursa(job #3128936)

Utilizator dobreraduDobre Radu Fabian dobreradu Data 11 mai 2023 16:43:40
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 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;
}