Cod sursa(job #3152350)

Utilizator emazareMazare Emanuel emazare Data 24 septembrie 2023 18:24:15
Problema Lapte Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <fstream>
#include <stack>

using namespace std;

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

int dp[105][105],pre[105][105];
pair<int, int> timp[105];
stack<int> stk;

int main()
{
    int n,t,l,st,dr,mid;
    fin >> n >> l;
    for(int i=1;i<=n;i++)
        fin >> timp[i].first >> timp[i].second;
    st = 1; dr = 100; t = 100;
    while(st<=dr){
        mid = (st+dr)/2;
        int var = 0;
        for(int i=1;i<=n;i++){
            int xm = mid/(timp[i].first);
            for(int j=0;j<=min(100,var+xm);j++){
                dp[i][j] = 0;
                for(int x=max(0,j-var);x<=min(xm,j);x++){
                    if(dp[i][j]<dp[i-1][j-x]+(mid-x*timp[i].first)/(timp[i].second)){
                        dp[i][j] = dp[i-1][j-x]+(mid-x*timp[i].first)/(timp[i].second);
                        pre[i][j] = x;
                    }
                }
            }
            var+=xm; var = min(var, 100);
        }
        if(dp[n][l]>=l){
            t = mid;
            dr = mid-1;
        }
        else
            st = mid+1;
    }
    fout << t << '\n';
    int var = 0;
    for(int i=1;i<=n;i++){
        int xm = t/(timp[i].first);
        for(int j=0;j<=min(100,var+xm);j++){
            dp[i][j] = 0;
            for(int x=max(0,j-var);x<=min(xm,j);x++){
                if(dp[i][j]<dp[i-1][j-x]+(t-x*timp[i].first)/(timp[i].second)){
                    dp[i][j] = dp[i-1][j-x]+(t-x*timp[i].first)/(timp[i].second);
                    pre[i][j] = x;
                }
            }
        }
        var+=xm; var = min(var, 100);
    }
    var = l;
    for(int i=n;i>0;i--){
        int x = pre[i][var];
        var-=x;
        stk.push(x);
    }
    for(int i=1;i<=n;i++){
        int x = stk.top();
        fout << x << " ";
        int nr = (t-x*timp[i].first)/(timp[i].second);
        fout << nr << '\n';
        stk.pop();
    }
    return 0;
}