Cod sursa(job #1112093)

Utilizator Ionut228Ionut Calofir Ionut228 Data 19 februarie 2014 13:33:36
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream fin("lapte.in");
ofstream fout("lapte.out");

const int INF = 0x3f3f3f3f;

int N, L;
int T, sol[101][101];
int lapteA[101], lapteB[101];
int dp[101][101], constr[101][101];

int solve(int timp)
{
    memset(dp, -INF, sizeof(dp));
    memset(constr, 0, sizeof(constr));

    dp[0][0] = 0;
    for (int i = 1; i <= N; ++i)
        for (int j = 0; j <= L; ++j)
            for (int k = 0; k <= j && k * lapteB[i] <= timp; ++k)
            {
                if (dp[i - 1][j - k] + (timp - k * lapteB[i]) / lapteA[i] > dp[i][j])
                {
                    dp[i][j] = dp[i - 1][j - k] + (timp - k * lapteB[i]) / lapteA[i];
                    constr[i][j] = k;
                }
            }
    if (dp[N][L] >= L)
        return 1;
    return 0;
}

void cb()
{
    int l = 0, r = 101;
    while (r - l > 1)
    {
        int mid = (l + r) / 2;

        if (solve(mid))
        {
            r = mid;
            memcpy(sol, constr, sizeof(constr));
            T = mid;
        }
        else
            l = mid;
    }
}

void lala()
{
    for (int i = 1; i <= 100; ++i)
        if (solve(i))
        {
            T = i;
            memcpy(sol, constr, sizeof(constr));
            break;
        }
}

void afisare(int i, int j)
{
    if (i == 0)
        return;
    afisare(i - 1, j - sol[i][j]);

    fout << (T - sol[i][j] * lapteB[i]) / lapteA[i] << ' ' << sol[i][j] << '\n';
}

int main()
{
    fin >> N >> L;
    for (int i = 1; i <= N; ++i)
        fin >> lapteA[i] >> lapteB[i];

    cb();

    fout << T << '\n';
    afisare(N, L);

    fin.close();
    fout.close();
    return 0;
}