Cod sursa(job #2951831)

Utilizator handicapatucavasi eduard handicapatu Data 7 decembrie 2022 14:17:21
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("lapte.in");
ofstream g("lapte.out");

int n , L , T;
int tA[105] , tB[105];
int dp[105][105]; ///dp[i][lapteA] = cantitatea maxima de lapteB pe care o pot bea primele i persoane daca beau lapteA
vector < pair < int , int > > ans;

void init(){
    for(int i = 0 ; i <= n ; ++i)
        for(int j = 0 ; j <= L ; ++j)
            dp[i][j] = -2000000000;
}

bool check(int T){
    init();
    dp[0][0] = 0;
    for(int i = 1 ; i <= n ; ++i){
        for(int j = 0 ; j <= L ; ++j){
            for(int la = 0 ; la <= T / tA[i] ; ++la){
                int lb = (T - la * tA[i]) / tB[i];
                dp[i][j] = max(dp[i][j] , dp[i - 1][max(0 , j - la)] + lb);
            }
        }
    }
    if(dp[n][L] >= L)
        return 1;
    return 0;
}

void recon(){
    init();
    dp[0][0] = 0;
    for(int i = 1 ; i <= n ; ++i){
        for(int j = 0 ; j <= L ; ++j){
            for(int la = 0 ; la <= T / tA[i] ; ++la){
                int lb = (T - la * tA[i]) / tB[i];
                dp[i][j] = max(dp[i][j] , dp[i - 1][max(0 , j - la)] + lb);
            }
        }
    }
    int i = n , j = L;
    int ans1 , ans2 , k;
    while(i >= 1){
        for(int la = 0 ; la <= T / tA[i] ; ++la){
            int lb = (T - la * tA[i]) / tB[i];
            if(j - la >= 0 && dp[i - 1][j - la] + lb == dp[i][j]){
                ans1 = la;
                ans2 = lb;
                k = la;
            }
        }
        j -= k;
        --i;
        ans.push_back({ans1 , ans2});
    }
    reverse(ans.begin() , ans.end());
    for(auto it : ans)
        g << it.first << " " << it.second << "\n";
}

int main()
{
    f >> n >> L;
    for(int i = 1 ; i <= n ; ++i)
        f >> tA[i] >> tB[i];
    int left = 1 , right = 100;
    while(left <= right){
        int m = (left + right) / 2;
        if(check(m)){
            T = m;
            right = m - 1;
        }
        else left = m + 1;
    }
    g << T << "\n";
    recon();
    return 0;
}