Cod sursa(job #1801332)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 8 noiembrie 2016 21:33:47
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <iostream>
#include <cstdio>
#define MAXN 120
#define inf 0x3f3f3f3f


using namespace std;

int n, L, rez;
int a[MAXN], b[MAXN];
int din[MAXN][MAXN], t[MAXN][MAXN];

void read()
{
    scanf("%d %d", &n, &L);
    for (int i = 1; i <= n; i++)
        scanf("%d %d", &a[i], &b[i]);

}

int check(int timp)
{
    for (int i = 1; i <= L+1; i++) din[0][i] = -inf;
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= L; j++) {
            din[i][j] = -inf;
            for (int k = j; k >= 0; k--) {
				if (timp < a[i]*(j-k)) continue;
                int np = din[i-1][k] + (timp-a[i]*(j-k))/b[i];
                if (np > din[i][j]) {
                    din[i][j] = np;
					t[i][j] = k;
                }
            }
        }
    }
    return (din[n][L] >= L);
}

void traseu(int i, int j)
{
    if (i > 1)
        traseu(i-1, t[i][j]);
    printf("%d %d\n", j-t[i][j], (rez-a[i]*(j-t[i][j]))/b[i]);
}

void solve()
{
    int step, timp;
    step = 64, timp = 100;
    for (step; step; step >>= 1) {
        if (timp - step >= 0 && check(timp-step))
            timp -= step;
    }
    rez = timp;
    printf("%d\n", rez);
    check(rez);
    traseu(n, L);
}

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

    read();
    solve();

    return 0;
}