Cod sursa(job #1307984)

Utilizator wGEORGEWGeorge Cioti wGEORGEW Data 3 ianuarie 2015 11:42:25
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 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();
}