Cod sursa(job #1023544)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 7 noiembrie 2013 10:35:09
Problema Lapte Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 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];
pair < int, int > Prev[MAX_N][MAX_N][MAX_N];
bool D[MAX_N][MAX_N][MAX_N];

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

    return D[N][L][L];
}

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

    int x = L, y = L;
    for(int k = N; k; --k) {
        int x1 = Prev[k][x][y].first, y1 = Prev[k][x][y].second;
        ans[k][0] = x - x1, ans[k][1] = y - y1;
        x = x1, y = y1;
    }
}

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;
}