Cod sursa(job #2065398)

Utilizator vladdy47Bucur Vlad Andrei vladdy47 Data 13 noiembrie 2017 19:04:58
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
# include <bits/stdc++.h>

using namespace std;

const int Nmax = 1e2 + 5;

struct da{int x, y;};

da a[Nmax], ans[Nmax];
int dp[Nmax][Nmax], drum[Nmax][Nmax], n, l, sol;

void input()
{
    scanf("%d %d\n", &n, &l);

    for (int i = 1; i <= n; ++i)
        scanf("%d %d\n", &a[i].x, &a[i].y);
}

bool solve(int T)
{
    int i, j, k;
    memset(dp, 0, sizeof(dp));
    memset(drum, 0, sizeof(drum));

    for (i = 0; i <= n; ++i)
        for (j = 1; j <= l; ++j)
            dp[i][j] = -1;

    for (i = 1; i <= n; ++i)
        for (j = 0; j <= l; ++j)
            for (k = 0; k <= min(T / a[i].x, j); ++k)
            {
                if (dp[i-1][j - k] == -1) continue;
                if (dp[i][j] >= dp[i - 1][j - k] + (T - (k * a[i].x)) / a[i].y) continue;
                dp[i][j] = dp[i - 1][j - k] + (T - (k * a[i].x)) / a[i].y;
                drum[i][j] = k;
            }
    if (dp[n][l] >= l) return true;

    return false;
}

void recons()
{
    for (int i = n; i >= 1; --i)
    {
        ans[i].x = drum[i][l];
        l -= ans[i].x;
        ans[i].y = (sol - a[i].x * ans[i].x) / a[i].y;
    }
}

void compute()
{
    int left = 0, right = (a[1].x + a[1].y) * l, mid;

    while (left <= right)
    {
        mid = (left + right) >> 1;
        if (solve(mid)) sol = mid, right = mid - 1;
        else left = mid + 1;
    }

    recons();
}

void output()
{
    printf("%d\n", sol);

    for (int i = 1; i <= n; ++i)
        printf("%d %d\n", ans[i].x, ans[i].y);
}

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

    input();
    compute();
    output();

    return 0;
}