Cod sursa(job #1514094)

Utilizator tudorcomanTudor Coman tudorcoman Data 30 octombrie 2015 15:50:53
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb

#include <cstdio>
#include <cstring>

const int maxN = 105;
const int inf = 10000000000;
int N, L, a[maxN + 3], b[maxN + 3];
int d[maxN + 3][maxN + 3], K[maxN + 3][maxN + 3];

void dinamica(int T) {
    memset(d, 0, sizeof d);
    memset(K, 0, sizeof K);
    for(register int i = 1; i <= L; ++ i)
        d[0][i] = -inf;
    for(register int i = 1; i <= N; ++ i)
        for(register int j = 0; j <= L; ++ j) {
            d[i][j] = d[i - 1][j] + T / b[i];
            for(register int k = 0; k <= j and k * a[i] <= T; ++ k) {
                int f = d[i - 1][j - k] + (T - k * a[i]) / b[i];
                if(d[i][j] < f)
                    d[i][j] = f,
                    K[i][j] = k;
            }
        }
}

void reconstituie(int n, int s, int last) {
    if(n) {
        int cantA = K[n][s], cantB = (last - cantA * a[n]) / b[n];
        reconstituie(n - 1, s - cantA, last);
        printf("%d %d\n", cantA, cantB);
    }
}
int main(void) {
    freopen("lapte.in", "r", stdin);
    freopen("lapte.out", "w", stdout);
    scanf("%d %d", &N, &L);
    for(register int i = 1; i <= N; ++ i)
        scanf("%d %d", &a[i], &b[i]);
    int st = 1, dr = 100, last = dr;
    while(st <= dr) {
        int mid = (st + dr) >> 1;
        dinamica(mid);
        if(d[N][L] >= L)
            last = mid,
            dr = mid - 1;
        else
            st = mid + 1;
    }
    printf("%d\n", last);
    dinamica(last);
    reconstituie(N, L, last);
    return 0;
}