Cod sursa(job #1897746)

Utilizator raulmuresanRaul Muresan raulmuresan Data 1 martie 2017 17:48:47
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <fstream>
#include <iostream>
#include <cmath>
using namespace std;

const int nMax = 110;
int n, l;
struct litrii {
    int a, b;
} v[nMax];
int a[nMax][nMax], abaut[nMax][nMax];
ifstream in("lapte.in");
ofstream out("lapte.out");

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

bool ok(int t) {
    // a[i][j] = nr maxim de litrii de b care pot fii bauti de primii i oameni
    // stiind ca s-au baut j litrii de a
    for (int lc = 1; lc <= l; ++lc) {
        a[0][lc] = -2000000;
    }
    for (int i = 1; i <= n; ++i) {
        for (int lc = 0; lc <= l; ++lc) {
            // vreau sa calculez a[i][lc]
            // iau pa rand cati litrii de a vreau sa bea i
            a[i][lc] = -2000000;
            for (int k = 0; k <= lc; ++k) {
                // i bea k litrii de a
                if (k * v[i].a > t) {
                    continue;
                }
                int lb = (t - k * v[i].a) / v[i].b + a[i-1][lc - k];
                if (a[i][lc] < lb) {
                    a[i][lc] = lb;
                    abaut[i][lc] = k;
                }
            }
        }
    }
    return a[n][l] >= l;
}

int bs() {
    //cautam binar timpul maxim
    int i, step = 1 << 7;
    int st = 1, dr = 100, gasit = -1;
    while(st <= dr)
    {
        int mij = (st + dr) / 2;
        if(ok(mij) == true)
        {
            gasit = mij;
            dr = mij - 1;
        }
        else
        {
            st = mij + 1;
        }
    }
    //out << gasit << "\n";
    return gasit;
}

void reconstruieste(int t, int i, int lc) {
    if (i != 1) {
        reconstruieste(t, i - 1, lc - abaut[i][lc]);
    }
    out << abaut[i][lc] << ' ' << (t - abaut[i][lc] * v[i].a) / v[i].b << '\n';
}

int main() {

    citire();

    int timp = bs();

    out << timp << '\n';

    ok(timp);
    reconstruieste(timp, n, l);

    return 0;
}