Cod sursa(job #1230403)

Utilizator smaraldaSmaranda Dinu smaralda Data 18 septembrie 2014 14:13:12
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;

const int NMAX = 105, INF = 2e9;

int n, l, last[NMAX][NMAX], d[NMAX][NMAX], a[NMAX], b[NMAX], solA[NMAX], solB[NMAX];
bool vis[NMAX];

bool check (int t) {
    int i, j, A, B;

    memset(last, 0, sizeof(last));
    memset(d, 0, sizeof(d));
    for(A = 1; A <= l; ++ A)
        d[0][A] = -INF;

    for(i = 1; i <= n; ++ i)
        for(j = 0; j <= l; ++ j) { 
            last[i][j] = 0;
            d[i][j] = d[i - 1][j] + t / b[i];

            for(A = 1; A <= j && A * a[i] <= t; ++ A) {
                B = (t - A * a[i]) / b[i];
                if(d[i - 1][j - A] + B > d[i][j]) {
                    d[i][j] = d[i - 1][j - A] + B;
                    last[i][j] = A;
                }
            }
        }
    return d[n][l] >= l; 
}

int bs (int right) {
    int left, mid, sol;

    left = 1;
    while(left <= right) {
        mid = (left + right) / 2;
        if(check(mid)) {
            sol = mid;
            right = mid - 1;
        }
        else
            left = mid + 1;
    }

    return sol;
}

void buildSol(int t) {
    int i, j;

    j = l;
    for(i = n; i >= 1; -- i) {
        solA[i] = last[i][j];
        solB[i] = (t - a[i] * solA[i]) / b[i];

        j -= solA[i];
    }
}

int main() {
    freopen("lapte.in", "r", stdin);
    freopen("lapte.out", "w", stdout);
    int i, t;

    scanf("%d%d", &n, &l);
    for(i = 1; i <= n; ++ i)
        scanf("%d%d", &a[i], &b[i]);

    t = bs(100);
    buildSol(t);

    printf("%d\n", t);
    for(i = 1; i <= n; ++ i)
        printf("%d %d\n", solA[i], solB[i]);
    return 0;
}