Cod sursa(job #2674580)

Utilizator GligarEsterabadeyan Hadi Gligar Data 19 noiembrie 2020 17:37:33
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 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;
}