Cod sursa(job #3257138)

Utilizator iulia_morariuIuli Morariu iulia_morariu Data 16 noiembrie 2024 19:11:37
Problema Lapte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.41 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <climits>
//#include <bits/stdc++.h>
#define in fin
#define out fout
#define oo INT_MAX

using namespace std;

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

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int n, L; in >> n >> L;
    int A[n + 1], B[n + 1];
    for(int i = 1; i <= n; i++) in >> A[i] >> B[i];

    int l = 1, r = 1000000000; // pt timp
    int sol = 0;
    while(l <= r){
        int t = (l + r) / 2;
        int dp[n + 1][105];
        for(int i = 0; i <= n; i++){
            for(int j = 0; j <= 100; j++) dp[i][j] = -1;
        }

        // for(int a = 0; a <= L; a++){
        //     for(int x = 0; x <= a; x++){
        //         dp[0][a] = max(dp[0][a], (t - x * A[0]) / B[0]);
        //         if(t == 17) cout << "a = " << a << " x = " << x << " facem b = " << (t - x * A[0]) / B[0] << '\n';
        //     }
        // }

        dp[0][0] = 0;

        for(int i = 1; i <= n; i++){
            for(int a = 0; a <= L; a++){
                for(int x = 0; x <= a && x * A[i] <= t; x++){
                    // if(t < 20) cout << "daca la " << i << " bem " << x << " lapte primim " << (t - x * A[i]) / B[i] << " litri de B\n";
                    int add = (t - A[i] * x) / B[i];
                    // if(add < 0) add = 0;
                    if(dp[i - 1][a - x] >= 0 && dp[i - 1][a - x] + add > dp[i][a]){
                        dp[i][a] = dp[i - 1][a - x] + add;
                        // if(a == L && t == 18){
                        //     cout << "vine " << dp[i][a] << " din " << i - 1 << " , " << a - x << " + " << add << " x = " << x << '\n';
                        // }
                    }
                }
            }
        }

        // if(t <= 20){
        //     // cout << "t = " << t << " dp : " << dp[n][L] << '\n';
        //     for(int i = 1; i <= n; i++){
        //         for(int j = 0; j <= L; j++) cout << dp[i][j] << " ";
        //         cout << '\n';
        //     }
        // }

        // cout << "t = " << t << " l = " << l << " r = " << r << '\n';

        if(dp[n][L] >= L){
            sol = t;
            r = t - 1;
        }else l = t + 1;
    }

    int dp[n + 1][105];
    for(int i = 0; i <= n; i++){
        for(int j = 0; j <= 100; j++) dp[i][j] = -1;
    }

    dp[0][0] = 0;

    int solA[n + 1][105], solB[n + 1][105];
    for(int i = 1; i <= n; i++){
        for(int a = 0; a <= L; a++){
            for(int x = 0; x <= a && x * A[i] <= sol; x++){
                // if(t < 20) cout << "daca la " << i << " bem " << x << " lapte primim " << (t - x * A[i]) / B[i] << " litri de B\n";
                int add = (sol - A[i] * x) / B[i];
                // if(add < 0) add = 0;
                if(dp[i - 1][a - x] >= 0 && dp[i - 1][a - x] + add > dp[i][a]){
                    dp[i][a] = dp[i - 1][a - x] + add;
                    solA[i][a] = x;
                    solB[i][a] = add;
                    // cout << "vine " << dp[i][a] << " din " << i - 1 << " , " << a - x << " + " << add << " x = " << x << '\n';
                }
            }
        }
    }

    out << sol << '\n';
    int a = L;
    vector< pair<int, int> > sl;
    for(int i = n; i >= 1; i--){
        sl.push_back( make_pair( solA[i][a], solB[i][a] ) );
        a -= solA[i][a];
    }
    reverse(sl.begin(), sl.end());
    for(int i = 0; i < sl.size(); i++) out << sl[i].first << " " << sl[i].second << '\n';

    return 0;
}