Cod sursa(job #1794949)

Utilizator giotoPopescu Ioan gioto Data 1 noiembrie 2016 20:56:20
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <cstdio>
#define INF 10000000
using namespace std;

int n, l, a[130], b[130], d[130][130], t[130][130];
inline bool PD(int T){
    for(int i = 1; i <= n ; ++i){
        for(int j = 0; j <= l ; ++j){
            d[i][j] = -INF;
            t[i][j] = 0;
            for(int k = 0; k <= j ; ++k)
                if(a[i] * (j - k) <= T)
            if(d[i][j] < d[i - 1][k] + (T - a[i] * (j - k)) / b[i]){
                d[i][j] =d[i - 1][k] + (T - a[i] * (j - k)) / b[i];
                t[i][j] = k;
            }
        }
    }
    if(d[n][l] < l)
        return 0;
    return 1;
}
inline void DFS(int l, int c){
    if(l != 1)
        DFS(l - 1, t[l][c]);
    printf("%d %d\n", c - t[l][c], d[l][c] - d[l - 1][t[l][c]]);
}
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 <= l ; ++i)
        d[0][i] = -INF;
    int st = 1, dr = 100000;
    while(st <= dr){
        int mid = (st + dr) / 2;
        if(PD(mid))
            dr = mid - 1;
        else
            st = mid + 1;
    }
    PD(st);
    printf("%d\n", st);
    DFS(n, l);
    return 0;
}