Cod sursa(job #3143846)

Utilizator catalinmarincatalinmarin catalinmarin Data 2 august 2023 15:35:49
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <fstream>
using namespace std;
ifstream cin("lapte.in");
ofstream cout("lapte.out");
int timeA[101];
int timeB[101];
int persoane, litri;
const int inf = 10000000;
int BinarySearch(int left, int right);
bool TestTime(int time, int type);
int BinarySearch(int left, int right){
    int result = -1;
    while (left <= right){
        int mid = left + (right - left) / 2;
        if (TestTime(mid, 0)){
            result = mid;
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    return result;
}
bool TestTime(int time, int type){
    int dp[101][101];
    for (int i = 0; i <= persoane; i++){
        for (int j = 0; j <= litri; j++)
            dp[i][j] = -inf;
    }
    dp[0][0] = 0;
    int previous[101][101];
    int milk_drank_each[101][2];
    for (int i = 1; i <= persoane; i++){
        for (int j = 0; j <= litri; j++){
            for (int lapteA = 0; lapteA <= j; lapteA++){
                if (lapteA * timeA[i] > time)
                    break;
                int lapteB = (time - lapteA * timeA[i]) / timeB[i];
                int temporary_dp = dp[i - 1][j - lapteA] + lapteB;
                if (temporary_dp > dp[i][j]) {
                    dp[i][j] = temporary_dp;
                    previous[i][j] = j - lapteA;
                }
            }
        }
    }
    if (type == 1){
        int best_j = litri;
        for (int i = persoane; i >= 1; i--){
            int previous_a_drank = best_j - previous[i][best_j];
            int lapteB = (time - previous_a_drank * timeA[i]) / timeB[i];
            milk_drank_each[i][0] = previous_a_drank;
            milk_drank_each[i][1] = lapteB;
            best_j = previous[i][best_j];
        }
        for (int i = 1; i <= persoane; i++)
            cout << milk_drank_each[i][0] << " " << milk_drank_each[i][1] << '\n';
    }
    if (dp[persoane][litri] >= litri)
        return true;
    return false;
}
int main(){
    cin >> persoane >> litri;
    for (int i = 1; i <= persoane; i++){
        cin >> timeA[i] >> timeB[i];
    }
    int timp = BinarySearch(1, 100);
    cout << timp << '\n';
    TestTime(timp, 1);
}