Cod sursa(job #763765)

Utilizator deneoAdrian Craciun deneo Data 3 iulie 2012 00:46:11
Problema Lapte Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <fstream>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

ifstream fin("lapte.in");
ofstream fout("lapte.out");

#define MAXN 200
#define upbound 500


int n, l, pd[MAXN][MAXN], a[MAXN], b[MAXN], reconst[MAXN][MAXN];

int doDinamica(int x) {
    int i, j, k;
    for (i = 0; i <= l; ++i) 
        pd[0][i] = -1;
    for (i = 1; i <= l; ++i) 
        memset(pd[i], 0, sizeof(pd[i]));
    pd[0][0] = 0;
    //if (x == 18)
    //    cerr << "OK\n";
    for (i = 1; i <= n; ++i)
        for (j = 0; j <= l; ++j) {
            pd[i][j] = -1;
            for (k = 0; k <= j; ++k) {
                    if (pd[i - 1][k] != -1 && pd[i][j] < pd[i - 1][k] + ((x - (j - k) * a[i]) / b[i]) && (x - (j - k) * a[i]) >= 0) {
                    pd[i][j] = pd[i - 1][k] + ((x - (j - k) * a[i]) / b[i]);
                    reconst[i][j] = j - k;
                }
                //if (x == 18 && i == 2){
                //    cerr << "j: " << j << " k: " << k << " b: " << pd[i][j] << " pd: ";
                //    cerr << pd[i - 1][k] << " wild: " << (x - (j - k) * a[i]) << "\n";;
                //}
            }
        }
    if (pd[n][l] >= l)
        return 1;
    return 0;
}

int cautareBinara() {
    int st = 1, fn = upbound, m;
    while(st < fn) {
        m = (st + fn) / 2;
        //cerr << "m: " << m << " rez: "  <<   doDinamica(m) << "\n";
        if (doDinamica(m))
            fn = m;
        else
            st = m + 1;
    }
    return st;

}

void raspunde(int n, int l, int rez) {
    int x, y;
    x = reconst[n][l];
    y = (rez - x * a[n]) / b[n];
    if (n != 1)
        raspunde (n - 1, l - x, rez);
    fout << x << " " << y << "\n";
}

int main() {
    int i, rez;
    fin >> n >> l;
    for (i = 1; i <= n; ++i)
        fin >> a[i] >> b[i];
    rez = cautareBinara();
    fout << rez << "\n";
    raspunde(n, l, rez);
    return 0;
}