Cod sursa(job #2007560)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 3 august 2017 12:04:33
Problema Lapte Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
// Este pacat sa rezolv problema asta in post?
// Poate ca da, pentru ca ii fac pe altii sa bea lapte.

#include <fstream>
#include <iostream>
#include <cstring>

using namespace std;

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

const int N = 105, f_mare = 1e9;
int l, n, i;
int a[N], b[N], af[N], bf[N], am[N], bm[N];

bool valid(int L) {  // cat lapte B se consuma in functie de laptele A: din timpul ramas L - (k*a[i]) al fiecarui
                     // concurent i  se bea atata lapte B cat sa se incadreze in timp
    int i, j, w;
    int dp[105][105];

    for (i = 1; i <= n; i++)
        am[i] = bm[i] = 0;

    for (i = 0; i <= 101; i++)
        for (j = 0; j <= 101; j++)
            dp[i][j] = -f_mare;

    dp[0][0] = 0;
    for (i = 1; i <= n; i++) {
        for (w = 0; w <= l; w++)
            for (j = 0; j <= L/a[i] && j <= w; j++) {
                if (dp[i-1][w-j] + (L - a[i]*j)/b[i] > dp[i][w]) {

                    dp[i][w] = dp[i-1][w-j] + (L - a[i]*j)/b[i];
                    am[i] = j;
                    bm[i] = (L - a[i]*j)/b[i];
                }
            }
    }

    return dp[n][l] >= l;
}

int main() {
    f >> n >> l;
    for (i = 1; i <= n; i++)
        f >> a[i] >> b[i];

    int p = (1<<30), w = p+1;
    for (;p;p/=2) {
        if (w-p < 0) continue;
        if (valid(w-p)) {
            w -= p;
        }
    }
    valid(w);
    for (i = 1; i <= n; i++)
        af[i] = am[i], bf[i] = bm[i];
    g << w << '\n';
    for (i = 1; i <= n; i++)
        g << af[i] << ' ' << bf[i] << '\n';
    ;
}