Cod sursa(job #3190941)

Utilizator radu._.21Radu Pelea radu._.21 Data 8 ianuarie 2024 14:13:41
Problema Lapte Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int n,L,a[10001],b[10001],tata[101][101],dp[101][101];
int solve(int val){
    memset(tata,0,sizeof(tata));
    for(int i = 1; i <= n ; i++)
        for(int j = 1;j<=L;j++)
            dp[i][j]=-1;
    for(int i = 0;i<=L;i++) /// cant de lapte A bauta de prima persoana
        if(i*a[1]<=val)
            dp[1][i]=(val-i*a[1])/b[1];

    for(int i = 2; i <=n; i ++ ){
        /// d[i][j] cant de lapte b bauta de primii i
        /// j = cantintatea a bauta de primii i
        //stare = 1- stare;
        for(int j = 0; j<=L ; j++){
            for(int k = 0; k<=j;k++)
                if(dp[i-1][k]!=-1 && (j-k)*a[i]<=val){
                /// beau j-k
                if(dp[i][j]<dp[i-1][k]+(val-(j-k)*a[i])/b[i])
                    dp[i][j]=dp[i-1][k]+(val-(j-k)*a[i])/b[i],tata[i][j]=k;
            }
        }
    }
    return dp[n][L];
}
void refacere(int lin,int col, int T){
    if(lin>=1){
        refacere(lin-1,tata[lin][col],T);
        fout<<col-tata[lin][col]<<" "<<(T-(col-tata[lin][col])*a[lin])/b[lin]<<"\n";
    }
}
int main(){
    fin>>n>>L;
    for(int i=1;i<=n;i++)
        fin>>a[i]>>b[i];
    int st = 0 , dr = 100;
    int best;
    while(st<=dr){
        int mij = (st+dr)/2;
        int ok = solve(mij);
        if(ok>=L)
            dr=mij-1,best = mij;
        else
            st = mij +1 ;

    }
    fout<<best<<'\n';
    solve(best);
    refacere(n,L,best);
    return 0;
}