Cod sursa(job #3288628)

Utilizator mariusharabariMarius Harabari mariusharabari Data 23 martie 2025 12:53:23
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <bits/stdc++.h>
using namespace std;

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

int n, l;
vector <vector <int>> dp;
vector <vector <int>> reza(105,vector<int>(105));
vector <pair <int,int>> c(105);

bool ok(int mij){
    dp.assign(n+1,vector <int>(l+1,-1));
    dp[0][0]=0;

    for(int i=1;i<=n;i++)
        for(int j=0;j<=l;j++)
            for(int k=0;k<=j&&k*c[i].first<=mij;k++)
                if(dp[i-1][j-k]>=0){
                    int nd=dp[i-1][j-k]+(mij-k*c[i].first)/c[i].second;
                    if(nd>dp[i][j]){
                        dp[i][j]=nd;
                        reza[i][j]=k;
                    }
                }
    return dp[n][l]>=l;
}

int main(){
    ios::sync_with_stdio(0);
    fin.tie(nullptr);
    fin>>n>>l;


    for(int i=1;i<=n;i++)
        fin>>c[i].first>>c[i].second;

    int st=1, dr=1000005, mij;
    while(st<=dr){
        mij=(st+dr)/2;
        if(ok(mij))
            dr=mij-1;
        else
            st=mij+1;
    }
    int t=dr+1;
    ok(t);

    vector <int> rezv(n+1);
    for(int i=n, s=l;i>0;i--){
        rezv[i]=reza[i][s];
        s-=rezv[i];
    }

    fout<<t<<endl;
    for(int i=1;i<=n;i++){
        fout<<rezv[i]<<' '<<(t-rezv[i]*c[i].first)/c[i].second<<endl;
    }
    return 0;
}