Cod sursa(job #2709640)

Utilizator MihneaCadar101Cadar Mihnea MihneaCadar101 Data 20 februarie 2021 19:53:22
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin ("lapte.in");
ofstream fout("lapte.out");
struct elem {
    int a, b;
};
int n, l, dp[150][150], aux[150][150], difa, difb;
elem v[159];

bool rezolva(int t) {

    for (int i = 0; i <= l; ++i) {
        dp[1][i] = INT_MIN;
        if (v[1].a * i > t)
            continue;

        dp[1][i] = (t - v[1].a * i) / v[1].b;
        aux[1][i] = 0;

    }

    for (int i = 2; i <= n; ++i) {
        for (int j = 0; j <= l; ++j) {
            dp[i][j] = INT_MIN;
            for (int k = 0; k <= j; ++k){
                if (v[i].a * (j - k) <= t) {
                    if (dp[i][j] < dp[i - 1][k] + (t - v[i].a * (j - k)) / v[i].b) {
                        dp[i][j] = dp[i - 1][k] + (t - v[i].a * (j - k)) / v[i].b;
                    }
                }
            }
        }
    }

    if (dp[n][l] >= l)
        return 1;
    return 0;

}

void afisare (int n, int l) {
    if (n != 1)
        afisare (n - 1, aux[n][l]);

    fout << l - difa << ' ' << dp[n][l] - difb << '\n';
    difa = l;
    difb = dp[n][l];

}

int main()
{
    fin >> n >> l;

    for (int i = 1; i <= n; ++i) {
        fin >> v[i].a >> v[i].b;
    }

    int st = 1, dr = 150;
    while (st <= dr) {
        int mid = (st + dr) / 2;
        if (rezolva(mid)) {
            dr = mid - 1;
        }
        else st = mid + 1;
    }

    fout << st << '\n';

    for (int i = 0; i <= l; ++i) {
        dp[1][i] = INT_MIN;
        if (v[1].a * i > st)
            continue;

        dp[1][i] = (st - v[1].a * i) / v[1].b;

    }

    for (int i = 2; i <= n; ++i) {
        for (int j = 0; j <= l; ++j) {
            dp[i][j] = INT_MIN;
            for (int k = 0; k <= j; ++k){
                if (v[i].a * (j - k) <= st) {
                    if (dp[i][j] < dp[i - 1][k] + (st - v[i].a * (j - k)) / v[i].b) {
                        dp[i][j] = dp[i - 1][k] + (st - v[i].a * (j - k)) / v[i].b;
                        aux[i][j] = k;
                    }
                }
            }
        }
    }

    afisare(n, l);
    return 0;
}