Cod sursa(job #3191205)

Utilizator ioanabaduIoana Badu ioanabadu Data 9 ianuarie 2024 07:10:01
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <iostream>
#include <fstream>
#include <climits>
#define N_MAX 104

using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");

/// rezultatele cerute sunt valorile (like preturile obiectelor), si ce mi se da sunt grautatile
int n, l, La[N_MAX], Lb[N_MAX];
int dp[N_MAX][N_MAX];
pair <int, int> ans[N_MAX];

bool verif (int t){
    for (int i=0; i<=n; ++i)
        for (int j=0; j<=l; ++j)
            dp[i][j] = INT_MIN;
    dp[0][0] = 0;

    for (int i=1; i<=n; ++i){
        for (int j=0; j<=l; ++j){
            for (int a=0; a<=t/La[i]; ++a){
                int b = (t - La[i] * a) / Lb[i];

                dp[i][j] = max (dp[i][j], dp[i-1][max(0, j-a)] + b);
            }
        }
    }

    if (dp[n][l] >= l)
        return true;
    return false;
}

int binarySearch (){
    int st = 1, dr = 100, mid;
    while (st != dr){
        mid = (st+dr)/2;
        if (verif(mid) == true)
            dr = mid;
        else
            st = mid + 1;
    }
    return dr;
}

void getAns (int t){
    verif(t);

    int index = l;

    for (int i=n; i>=1; --i){
        for (int a=0; a<=t/La[i]; ++a){
            int b = (t - La[i] * a) / Lb[i];

            if (index - a >= 0 && dp[i-1][index-a] + b == dp[i][index]){
                ans[i].first = a;
                ans[i].second = b;
            }
        }
        index -= ans[i].first;
    }

    out << t << '\n';
    for (int i=1; i<=n; ++i)
        out << ans[i].first << ' ' << ans[i].second << '\n';
}

int main (){
    in >> n >> l;
    for (int i=1; i<=n; ++i)
        in >> La[i] >> Lb[i];

    int Lans = binarySearch();

    getAns(Lans);
    return 0;
}