Cod sursa(job #2405370)

Utilizator IulianOleniucIulian Oleniuc IulianOleniuc Data 14 aprilie 2019 13:39:22
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
#define DMAX 110

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

inline int min(int x, int y) {
    return x < y ? x : y;
}

int n, q;
int tA[DMAX], tB[DMAX];

int dp[DMAX][DMAX];
int pr[DMAX][DMAX];

bool check(int time) {
    for (int i = 0; i <= n; i++)
        for (int j = 0; j <= q; j++)
            dp[i][j] = -1;

    dp[0][0] = 0;
    for (int i = 1; i <= n; i++)
        for (int j = 0; j <= q; j++)
            for (int k = 0; k <= min(j, time / tA[i]); k++)
                if (dp[i - 1][j - k] != -1 && dp[i - 1][j - k] + (time - k * tA[i]) / tB[i] > dp[i][j]) {
                    dp[i][j] = dp[i - 1][j - k] + (time - k * tA[i]) / tB[i];
                    pr[i][j] = k;
                }
    return dp[n][q] >= q;
}

void solve(int i, int j, int time) {
    if (i > 1)
        solve(i - 1, j - pr[i][j], time);
    fout << pr[i][j] << ' ' << (time - pr[i][j] * tA[i]) / tB[i] << '\n';
}

int main() {
    fin >> n >> q;
    for (int i = 1; i <= n; i++)
        fin >> tA[i] >> tB[i];

    int md, lo = 0, hi = 101;
    while (hi - lo > 1) {
        md = (lo + hi) / 2;
        if (check(md))
            hi = md;
        else
            lo = md;
    }

    fout << hi << '\n';
    check(hi);
    solve(n, q, hi);

    fout.close();
    return 0;
}