Cod sursa(job #1513692)

Utilizator tudorcomanTudor Coman tudorcoman Data 29 octombrie 2015 20:56:32
Problema Lapte Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb

#include <bits/stdc++.h>
using namespace std;

const int maxN = 100;
const int inf = 10000000000;

int N, L, a[maxN + 3], b[maxN + 3];
int d[maxN + 3][maxN + 3], K[maxN + 3][maxN + 3];

inline int formula(int i, int j, int k, int T) {
    return d[i - 1][j - k] + (T - k * a[i]) / b[i];
}

void dinamica(int T) {
    memset(d, 0, sizeof d);
    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) {
            K[i][j] = 0;
            d[i][j] = formula(i, j, 0, T);
            for(register int k = 0; k <= j and k * a[i] <= T; ++ k) {
                int f = formula(i, j, k, T);
                if(d[i][j] < f)
                    d[i][j] = f,
                    K[i][j] = k;
            }
        }
}

inline bool ok(int var) {
    dinamica(var);
    return d[N][L] >= L;
}

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 = inf, 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;
    }

    deque<pair<int, int>> Ans;
    printf("%d\n", last);
    dinamica(last);

    int lCurent = L;
    for(register int i = N; i > 0; -- i) {
        int cantA = K[i][lCurent], cantB = (last - cantA * a[i]) / b[i];
        Ans.push_front(make_pair(cantA, cantB));
        lCurent -= K[i][lCurent];
    }
    for(auto it = Ans.begin(); it != Ans.end(); ++ it)
        printf("%d %d\n", it->first, it->second);
    return 0;
}