Cod sursa(job #1891850)

Utilizator BugirosRobert Bugiros Data 24 februarie 2017 13:11:54
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <fstream>
using namespace std;

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

const int MAXN = 103;

int d[MAXN][MAXN];//d[i][j] - cantitatea de lapte bauta din tipul B, unde i reprezinta cat lapte
                  //          a fost baut din laptele A, si j reprezinta ultimul bautor

int pred[MAXN][MAXN];//pred[i][j] - cat lapte A a baut bautorul j, in total fiind bauti i litri de lapte A

int n,l;
int tA[MAXN], tB[MAXN];

void citire()
{
    in >> n >> l;
    for (int i = 1;i <= n;++i)
        in >> tA[i] >> tB[i];
}

void dinamica(int t)
{
    //initializare primul bautor
    for (int cantitate = 0;cantitate <= min(l, t / tA[1]);++cantitate)//cat lapte bea din A
    {
        d[cantitate][1] = (t - cantitate * tA[1]) / tB[1];
        pred[cantitate][1] = cantitate;
    }
    for (int j = min(l, t / tA[1]) + 1; j <= l;++j)
        d[j][1] = -1;

    for (int bautor = 2;bautor <= n;++bautor)
        for (int cantitate_echipa = 0;cantitate_echipa <= l;++cantitate_echipa)//cat lapte bea echipa in total
        {
            d[cantitate_echipa][bautor] = -1;
            for (int cantitate = 0;cantitate <= min(cantitate_echipa, t / tA[bautor]);++cantitate)//cat lapte bea din A
            {
                int val = d[cantitate_echipa - cantitate][bautor - 1] +
                          (t - cantitate * tA[bautor]) / tB[bautor];
                if (d[cantitate_echipa - cantitate][bautor - 1] != -1 &&
                    d[cantitate_echipa][bautor] < val)
                {
                    d[cantitate_echipa][bautor] = val;
                    pred[cantitate_echipa][bautor] = cantitate;
                }
            }
        }
}

int cautare_binara()
{
    int poz = 0;
    for (int pas = 1 << 14;pas >= 1;pas >>= 1)
    {
        dinamica(poz + pas);
        if (d[l][n] < l)
            poz += pas;
    }
    return poz + 1;
}

void afisare(int t)
{
    out << t << '\n';

    int cantitateA[MAXN] = {0};
    int cantitateB[MAXN] = {0};

    int lapteramas = l,bautor = n;
    while(bautor >= 1)
    {
        int lapte = pred[lapteramas][bautor];
        cantitateA[bautor] = lapte;
        cantitateB[bautor] = (t - lapte * tA[bautor]) / tB[bautor];
        lapteramas -= lapte;
        --bautor;
    }

    for (int i = 1;i <= n;++i)
        out << cantitateA[i] << ' ' << cantitateB[i] << '\n';
}

int main()
{
    citire();
    int t = cautare_binara();
    dinamica(t);
    afisare(t);
    return 0;
}