Cod sursa(job #2070486)

Utilizator lucametehauDart Monkey lucametehau Data 19 noiembrie 2017 16:55:24
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <fstream>
#include <climits>

using namespace std;

ifstream cin("lapte.in");
ofstream cout("lapte.out");

const int N_MAX = 100;

int n, L;

int va[1 + N_MAX], vb[1 + N_MAX];
int la[1 + N_MAX], lb[1 + N_MAX];

int sol[1 + N_MAX][1 + N_MAX];

int main()
{
    cin >> n >> L;
    for(int i = 1; i <= n; i++)
        cin >> va[i] >> vb[i];
    int st = 1, dr = 100, mj;
    while(st <= dr)
    {
        mj = (st + dr) / 2;
        for(int i = 0; i <= n; i++)
            for(int j = 0; j <= L; j++)
                sol[i][j] = INT_MIN;
        sol[0][0] = 0;
        for(int i = 1; i <= n; i++)
            for(int j = 0; j <= L; j++)
                for(int k = 0; k <= min(j, mj / va[i]); k++)
                    sol[i][j] = max(sol[i][j], sol[i - 1][j - k] + (mj - va[i] * k) / vb[i]);
        if(sol[n][L] < L)
            st = mj + 1;
        else
            dr = mj - 1;
    }
    cout << st << "\n";
    for(int i = 0; i <= n; i++)
        for(int j = 0; j <= L; j++)
            sol[i][j] = INT_MIN;
    sol[0][0] = 0;
    for(int i = 1; i <= n; i++)
        for(int j = 0; j <= L; j++)
            for(int k = 0; k <= min(j, st / va[i]); k++)
                sol[i][j] = max(sol[i][j], sol[i - 1][j - k] + (st - va[i] * k) / vb[i]);
    int j = L;
    for(int i = n; i >= 1; i--)
        for(int k = 0; k <= min(j, st / va[i]); k++)
        {
            if(sol[i - 1][j - k] + (st - va[i] * k) / vb[i] == sol[i][j])
            {
                la[i] = k;
                lb[i] = (st - va[i] * k) / vb[i];
                j -= k;
                break;
            }
        }
    for(int i = 1; i <= n; i++)
        cout << la[i] << " " << lb[i] << "\n";
    return 0;
}