Cod sursa(job #2574756)

Utilizator lupulescu2001Lupulescu Vlad lupulescu2001 Data 6 martie 2020 09:41:36
Problema Lapte Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>

using namespace std;

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

int dp[105][105], tt[105][105], n, l;
int a[105], b[105];

bool Check(int t) {
    for (int i = 0; i <= n; i++)
        for (int j = 0; j <= l; j++)
            dp[i][j] = -1000000;
    dp[0][0] = 0;
    for (int i = 1; i <= n; i++)
        for (int k = 0; k <= l; k++)
            for (int j = 0; j <= k; j++) {
                if (j * b[i] > t)
                    break;
                int p = (t - j * b[i]) / a[i];
                if (dp[i][k] < dp[i - 1][k - j] + p) {
                    dp[i][k] = dp[i - 1][k - j] + p;
                    tt[i][k] = k - j;
                }
            }
    return (dp[n][l] >= l);
}

int Solve() {
    int l = 1, r = 100;
    int sol = 0;
    while (l <= r) {
        int mid = (l + r) / 2;
        if (Check(mid) == 0) {
           sol = mid;
           l = mid + 1;
        } else r = mid - 1;
    }
    return sol + 1;
}

void Solve2(int i, int j) {
    if (i > 1)
        Solve2(i - 1, tt[i][j]);
    if (i >= 1)
        fout << dp[i][j] - dp[i - 1][tt[i][j]] << " " << j - tt[i][j] << '\n';
}

int main() {
    fin >> n >> l;
    for (int i = 1; i <= n; i++)
        fin >> a[i] >> b[i];
    fout << Solve() << '\n';
    Solve2(n, l);
}