Cod sursa(job #1023550)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 7 noiembrie 2013 10:48:44
Problema Lapte Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <fstream>

#include <cstring>
using namespace std;

const int MAX_N = 101;

int N, L;
int a[MAX_N], b[MAX_N], ans[MAX_N][2], D[MAX_N][MAX_N], Prev[MAX_N][MAX_N];

bool check(int T) {
    memset(D, 0, sizeof(D));
    for(int i = 0; i * a[1] <= T; ++i)
        D[1][i] = (T - i * a[1]) / b[1];
    for(int k = 2; k <= N; ++k)
        for(int i = 0; i <= L; ++i)
            for(int x = 0; x * a[k] <= T && x <= i; ++x) {
                int y = (T - x * a[k]) / b[k];
                D[k][i] = max(D[k][i], D[k - 1][i - x] + y);
            }

    if(D[N][L] >= L)
        return 1;
    return 0;
}

void buildSolution(int T) {
    memset(D, 0, sizeof(D));
    for(int i = 0; i * a[1] <= T; ++i)
        D[1][i] = (T - i * a[1]) / b[1];
    for(int k = 2; k <= N; ++k)
        for(int i = 0; i <= L; ++i)
            for(int x = 0; x * a[k] <= T && x <= i; ++x) {
                int y = (T - x * a[k]) / b[k];
                if(D[k - 1][i - x] + y > D[k][i]) {
                    D[k][i] = D[k - 1][i - x] + y;
                    Prev[k][i] = i - x;
                }
            }

    int x = L;
    for(int k = N; k; --k) {
        int x1 = Prev[k][x];
        ans[k][0] = x - x1, ans[k][1] = (T - (x - x1) * a[k]) / b[k];
        x = x1;
    }
}

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

    f >> N >> L;
    for(int i = 1; i <= N; ++i)
        f >> a[i] >> b[i];

    int minT = 20000;
    for(int l = 0, r = 20000, m; l <= r; ) {
        m = (l + r) / 2;
        if(check(m))
            minT = m, r = m - 1;
        else l = m + 1;
    }
    buildSolution(minT);

    g << minT << "\n";
    for(int i = 1; i <= N; ++i)
        g << ans[i][0] << " " << ans[i][1] << "\n";

    f.close();
    g.close();

    return 0;
}