Cod sursa(job #1297643)

Utilizator diana97Diana Ghinea diana97 Data 22 decembrie 2014 11:07:46
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMAX = 128 + 1;
const int INF = 0x3fffffff;

int n, l;
int a[NMAX], b[NMAX], folosit[NMAX];
int cant[NMAX][NMAX], ant[NMAX][NMAX];

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

bool ok(int timp) {
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j <= l; j++)
            cant[i][j] = -INF;
        cant[i][0] = 0;
    }
    int max_a;

    for (int i = 1; i <= n; i++) {
        max_a = timp / a[i];
        for (int a_used = 0; a_used <= max_a; a_used++) {
            int b_used = (timp - a_used * a[i]) / b[i];
            for (int j = l; j >= a_used; j--)
                if (cant[i][j] < cant[i - 1][j - a_used] + b_used) {
                    cant[i][j] = cant[i - 1][j - a_used] + b_used;
                    ant[i][j] = a_used;
                }
        }
    }
    return (cant[n][l] >= l);
}

void scrie(int timp) {
    for (int a_used = l, i = n; i >= 1; a_used -= ant[i][a_used], i--)
        folosit[i] = ant[i][a_used];

    for (int i = 1; i <= n; i++)
        g << folosit[i] << ' ' << (timp - a[i] * folosit[i]) / b[i] << '\n';
}

void rezolva() {
    int m, st = 0, dr = 128, sol;

    while (st <= dr) {
        m = (st + dr) / 2;
        if (ok(m)) {
            sol = m;
            dr = m - 1;
        }
        else st = m + 1;
    }

    g << sol << '\n';
    ok(sol);
    scrie(sol);
}

int main() {
    citeste();
    rezolva();
}