Cod sursa(job #266510)

Utilizator ErgoVicol Sergiu Constantin Ergo Data 25 februarie 2009 18:14:07
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <fstream>

using namespace std;

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

#define NMAX 102
struct bautor {int a,b;};

int A[NMAX][NMAX], N, L, tsol, C[NMAX][NMAX], D[NMAX][NMAX];
bautor B[NMAX], soli[NMAX];

int Verifica(int t)
{
        int i, j, k;
        
        for (i = 1; i <= N; i++)
                for (j = 0; j <= L;j++)
                        for (A[i][j] = -1,k = 0; k <= j && A[i-1][k] != -1; k++)
                        if (t - (j - k) * B[i].a >= 0)
                                if (A[i-1][k] + ( (t - (j - k) * B[i].a) / B[i].b ) > A[i][j] )
                                        A[i][j] = A[i - 1][ k ] + ((t - (j - k) * B[ i ].a) / B[ i ].b), C[i][j] = k;

        if (A[N][L] >= L)
        {
            for(i=1; i<=N;i++)
                for(j=1;j<=L;j++)
                    D[i][j] = C[i][j];
            tsol = t;
            return 1;
        }
        else
                return 0;

}

int main()
{
        int i, j, st, end, m, sol;
        fin >>N >>L;
        for (i = 1; i <= N; i++)
                fin >>B[i].a >>B[i].b;

        st = 1, end = 100;
        for (i = 1; i <= L; i++)
            A[0][i] = -1;
        while (st <= end)
        {
                m = (st + end) / 2;
                if (Verifica(m))
                {
                        sol = m;
                        end = m - 1;
                }
                else
                        st = m + 1;
        }
        fout <<sol<<'\n';

        for (i = N, j = L; i >= 1;j = D[i][j], i--)
            soli[i].a = j - D[i][j], soli[i].b = (tsol - B[i].a*soli[i].a) / B[i].b;
        for (i = 1; i <= N; i++)
            fout <<soli[i].a <<' ' <<soli[i].b <<'\n';
        fout.close();
        return 0;
}