Cod sursa(job #1250260)

Utilizator YoChinezuWeng Mihai Alexandru YoChinezu Data 27 octombrie 2014 22:29:17
Problema Lapte Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;

int n, l, a[105], b[105];
int d[105][105];
int x[105][105];

struct laptic {
    int lapte_a, lapte_b;
};

vector < laptic > v;

void ok(int t) {
    memset(d, 0, sizeof(d));
    
    for(int i = 1; i <= l; ++ i) {
        d[0][i]=-1000000000;
    }
    
    for(int i = 1; i <= n ; ++ i) {
        for(int j = 0; j <= l; ++ j) {
            x[i][j] = 0;
            d[i][j] = d[i - 1][j] + t / b[i];
            for(int k = 0; k <= t / a[i] && k <= j; ++ k) {
                if(d[i][j] < d[i - 1][j - k] + (t - k * a[i]) / b[i]) {
                    d[i][j] = d[i - 1][j - k] + (t - k * a[i]) / b[i];
                    x[i][j] = k;
                }
            }
        }
    }
}

int binar(int st, int dr) {
    int last, med;
    last = dr;
    
    while(st<=dr) {
        med = st + (dr - st) / 2;
        ok(med);
        if(d[n][l] >= l) {
            last = med;
            dr = med - 1;
        }else {
            st = med + 1;
        }
    }
    
    return last;
}

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]);
    }
    
    int last = binar(1, l * (a[1] + b[1]));
    
    printf("%d\n", last);
    
    int m = 0;
    laptic aux;
    
    for(int i = n; i >= 1; -- i) {
        aux.lapte_a = x[i][l];
        aux.lapte_b = (last - aux.lapte_a * a[i]) / b[i];
        v.push_back(aux);
        l -= x[i][l];
        ++ m;
    }
    
    for(int i = m - 1; i >= 0; --i) {
        printf("%d %d\n", v[i].lapte_a, v[i].lapte_b);
    }
    
    return 0;
}