Cod sursa(job #3351926)

Utilizator serbanbBrindescu Serban serbanb Data 22 aprilie 2026 14:01:17
Problema Lapte Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

const int INF = 1000000000;
int n,l;
int vA[105];
int vB[105];
int dp[105][105];
int aux[105][105];
int tmin;
vector<pair<int, int>> ans;

void read()
{
    fin >> n >> l;
    for(int i = 1; i <= n; ++i){
        fin >> vA[i] >> vB[i];
    }
}

void buildDP(int t)
{
    for(int j = 1; j <= l; ++j){
        dp[0][j] = -INF;
    }
    for(int i = 1; i <= n; ++i){
        for(int j = 0; j <= l; ++j){
            for(int a = 0; a <= j; ++a){
                if(a * vA[i] > t){
                    break;
                }
                int maxB = dp[i - 1][j - a] + (t - a * vA[i]) / vB[i];
                if(maxB > dp[i][j]){
                    dp[i][j] = maxB;
                    aux[i][j] = j - a;
                }
            }
        }
    }
}

bool check(int t)
{
    for(int i = 0; i <= n; ++i){
        for(int j = 0; j <= l; ++j){
            dp[i][j] = 0;
        }
    }
    buildDP(t);
    if(dp[n][l] >= l){
        return true;
    }
    return false;
}

void binarySearch()
{
    int l = 1, r = 20000;
    while(l <= r){
        int m = (l + r) / 2;
        if(check(m)){
            r = m - 1;
        }
        else{
            l = m + 1;
        }
    }
    if(check(r)){
        tmin = r;
    }
    else if(check(l)){
        tmin = l;
    }

}

void print()
{
    fout << tmin << '\n';
    int j = l;
    for(int i = n; i >= 1; --i){
        int a = j - aux[i][j];
        int b = (tmin - a * vA[i]) / vB[i];
        ans.push_back(make_pair(a, b));
        j = aux[i][j];
    }
    for(int i = ans.size() - 1; i >= 0; --i){
        fout << ans[i].first << ' ' << ans[i].second << '\n';
    }
}

int main()
{
    read();
    binarySearch();
    print();
    return 0;
}