Cod sursa(job #761575)

Utilizator SchumiDumitru Andrei Georgian Schumi Data 26 iunie 2012 17:01:47
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <cstdio>

using namespace std;

const int maxn = 105;

int n, p, l, reconst[maxn][maxn], d[maxn][maxn], a[maxn], b[maxn], sol, raspa[maxn], raspb[maxn];

int verifica(int x)
{
    int i, j, k;
    for(i = 0; i <= n; ++i)
        for(j = 0; j <= l; ++j) {
            d[i][j] = -1;
            reconst[i][j] = 0;
        }
    d[0][0] = 0;
    for(i = 1; i <= n; ++i) {
        for(j = 0; j <= l; ++j) {
            for(k = 0; k <= j; ++k) {
                if(d[i - 1][k] != -1 && (j - k) * a[i] <= x)
                    if(d[i - 1][k] + (x - (j - k) * a[i]) / b[i] > d[i][j]) {
                        d[i][j] = d[i - 1][k] + (x - (j - k) * a[i]) / b[i];
                        reconst[i][j] = k;
                    }
            }
        }
    }
    if(d[n][l] >= l)
        return 1;
    return 0;
}

void cauta()
{
    int left = 1, right = 101, mij;
    while(left <= right) {
        mij = (left + right) / 2;
        if(verifica(mij)) {
            sol = mij;
            right = mij - 1;
        }
        else left = mij + 1;
    }
}

int main()
{
    int i;
    freopen ("lapte.in", "r", stdin);
    freopen ("lapte.out", "w", stdout);
    scanf("%d %d", &n, &l);
    for(i = 1; i <= n; ++i)
        scanf("%d %d", &a[i], &b[i]);
    cauta();
    printf("%d\n", sol);
    p = l;
    for(i = n; i >= 1; --i) {
        raspa[i] = reconst[i][p];
        raspb[i] = (sol - raspa[i] * a[i]) / b[i];
        p -= raspa[i];
    }
    for(i = 1; i <= n; ++i)
        printf("%d %d\n", raspa[i], raspb[i]);
    return 0;
}