Cod sursa(job #1236508)

Utilizator EpictetStamatin Cristian Epictet Data 2 octombrie 2014 00:27:56
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <fstream>
using namespace std;
ifstream fin ("lapte.in");
ofstream fout ("lapte.out");
int N, L, sol, A[110], B[110], dp[110][110], drum[110][110];
struct { int x, y; } S[110];

bool Verif(int T)
{
    for (int i=0; i<=N; i++)
        for (int j=0; j<=L; j++)
            dp[i][j] = -1;
    dp[0][0] = 0;

    for (int i=1; i<=N; i++)
    {
        for (int j=0; j<=L; j++)
        {
            for (int k=0; k*A[i]<=T; k++)
            {
                if(dp[i-1][j-k] < 0) continue;
                int timp_a = k * A[i];
                int litri_b = (T - timp_a) / B[i];
                if (dp[i-1][j-k] + litri_b > dp[i][j])
                {
                    dp[i][j] = dp[i-1][j-k] + litri_b;
                    drum[i][j] = k;
                }
            }
        }
    }

    if (dp[N][L] >= L)
    {
        int nr = L;
        for (int i=N; i>=1; i--)
        {
            S[i].x = drum[i][nr];
            S[i].y = (T - S[i].x * A[i]) / B[i];
            nr -= S[i].x;
        }
        return 1;
    }

    return 0;
}

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

    int p = 1, u = 100, mij;
    while (p <= u)
    {
        mij = (p + u) / 2;
        if (Verif(mij)) u = mij - 1, sol = mij;
        else            p = mij + 1;
    }

    fout << sol << '\n';
    for (int i=1; i<=N; i++) fout << S[i].x << ' ' << S[i].y << '\n';
    fout.close();
    return 0;
}