Cod sursa(job #1539162)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 30 noiembrie 2015 13:15:58
Problema Lapte Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cstdio>

#define DIM 128
#define INF 65536
using namespace std;

int N, L, left, right, middle, D[DIM][DIM], T[DIM][DIM], A[DIM], B[DIM], qA[DIM], qB[DIM];

bool getVerif (int time) {

    for (int i = 1; i <= N; i ++)
    for (int j = 0; j <= L; j ++) {
        D[i][j] = -INF;

        for (int k = j; k >= 0; k --)
        if (A[i] * (j - k) <= time)
        if (D[i][j] < D[i-1][k] + (time - A[i] * (j - k)) / B[i]) {
            D[i][j] = D[i-1][k] + (time - A[i] * (j - k)) / B[i];
            qA[i] = j - k;
            qB[i] = (time - A[i] * (j - k)) / B[i];
            T[i][j] = k;
        }
    }

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

void DFS (int line, int column) {

    if (line != 1)
        DFS (line - 1, T[line][column]);

    printf ("%d %d\n", qA[line], qB[line]);
    return;
}

int main () {

    freopen ("lapte.in" ,"r", stdin );
    freopen ("lapte.out","w", stdout);

    scanf ("%d %d", &N, &L);

    for (int i = 1; i <= N; i ++)
        scanf ("%d %d", &A[i], &B[i]);

    for (int i = 1; i < DIM; i ++)
        D[0][i] = -INF;

    left = 1; right = 20;
    while (left <= right) {
        middle = left + (right - left) / 2;

        if (getVerif(middle))
            right = middle - 1;
        else
            left  = middle + 1;
    }

    getVerif (left);

    printf ("%d\n", left);
    DFS (N, L);

    return 0;
}