Cod sursa(job #2592143)

Utilizator RobertLearnsCDragomir Robert. RobertLearnsC Data 1 aprilie 2020 11:34:48
Problema Lapte Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, givenMilk, dp[105][105], ans[105][105];

struct type {
    int a, b;
} lp[105];

void clearLast() {
    for(int i =  1; i <= n; i++) {
        for(int j = 0; j <= givenMilk; j++) {
            dp[i][j] = 0;
        }
    }
}

int avoidZero(int b) {
    return b == 0? 0 : 1;
}

int yesOrNo(int ans1, int ans2) {
    return ans1 > ans2;
}

int good(int milk) {
    clearLast();
    int cnt = 0;

    for(int i = 0; i <= min(milk / lp[1].a, givenMilk); i++) {
        ans[1][i] = i;
        dp[1][i] = (milk - lp[1].a * i) / lp[1].b;
    }

    for(int i = 2; i <= n; i++) {
        for(int j = 0; j <= min(milk / lp[i].a, givenMilk); j++) {
            for(int k = 0; k <= givenMilk - j; k++) {
                if(dp[i - 1][k] >= 0 && dp[i - 1][k] + (milk - lp[i].a * j) / lp[i].b > dp[i][j + k])
                {
                    dp[i][j + k] = dp[i - 1][k] + (milk - lp[i].a * j) / lp[i].b;
                    ans[i][j + k] = j;
                    if(j + k >= givenMilk && dp[i][j + k] >= givenMilk) {
                           cnt++;
                    }
                }
            }
        }
    }
    return cnt > 0;
}

void bsearch(int &ans) {
    int left = 0, right = 100;
    while(left <= right) {
        int mid = (left + right) / 2;
        if(good(mid)) {
            ans = mid;
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
}

void linkPuzzle(int n, int myAns, int givenMilk, int & milkA, int & milkB) {
    if(n){
        milkA -= ans[n][givenMilk], milkB -= (myAns - ans[n][givenMilk ] * lp[n].a) / lp[n].b;
        linkPuzzle(n - 1, myAns, givenMilk - ans[n][givenMilk], milkA , milkB);
        out << ans[n][givenMilk] << ' ' << (myAns - ans[n][givenMilk ] * lp[n].a) / lp[n].b << '\n';
    }
}

int main()
{
    in >> n >> givenMilk;
    for(int i = 1; i <= n; i++) {
        in >> lp[i].a >> lp[i].b;
    }

    int myAns = 0, milkA = givenMilk, milkB = givenMilk;
    bsearch(myAns);

    out << myAns << '\n';
    linkPuzzle(n, myAns, givenMilk, milkA, milkB);

    /*if(milkA > 0 || milkB > 0) {
        cout <<"Incorrect";
    }
    */
    return 0;
}