Cod sursa(job #2394110)

Utilizator dorel02Dorel Surubelnita dorel02 Data 1 aprilie 2019 12:26:30
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <iostream>
#include <fstream>

using namespace std;

const int _oo = 0x80000001;
struct bautura
{
    int a, b;
};

bautura v[105];
int N, L;
int d[105][105]; ///d[i][j] = cant max de b care poate fi bauta a.i. sa se poata bea exact j litri de a de primele i persoane
int r[105][105];
int sol;

int get_b (int maxt, int i, int j)
{
    return (maxt - v[i].a * j)/v[i].b;
}

int bun (int t) ///incerc sa determin daca se poate bea cantitatea L in timpul T, pentru asta o sa prioritizez cu lapte A si o sa vad cat B imi ramane...
{
    for(int i = 0; i <= N; ++i)         ///trebe sa curat ca apelez asta de mai multe ori
        for(int j = 0; j <= L; ++j)
            d[i][j] = _oo;

    d[0][0] = 0;
    for(int i = 1; i <= N; ++i)
        for(int j = 0; j <= min(L, t/v[i].a); ++j)
            for(int k = j; k <= L; ++k)
                if(d[i][k] < d[i - 1][k - j] + get_b(t, i, j))
                {
                    d[i][k] = d[i - 1][k - j] + get_b(t, i, j);
                    ///store cat bea fiecare
                    r[i][k] = j;
                }
    if(d[N][L] >= L)
        return 1;
    else
        return 0;

}

ofstream out ("lapte.out");
void afis(int n, int cant)
{
    if (n > 0)
    {
        afis( n - 1, cant - r[n][cant]);
        out<<r[n][cant]<<" "<<get_b(sol, n, r[n][cant])<<"\n";
    }
}

int main()
{
    ifstream in ("lapte.in");


    in>>N>>L;
    for(int i = 1; i <= N; ++i)
        in>>v[i].a>>v[i].b;
    //T < 100

    int b = 1, e = 104;

    while(b < e)
    {
        int tmid = (b + e) / 2;
        if(bun(tmid))   ///caut timpul minim
        {
            //cout<<"SE POATE BEA IN "<<tmid<<"\n";
            e = tmid;
            sol = tmid;
        }
        else
            b = tmid + 1;
    }

    out<<sol<<"\n";
    bun(sol);
    afis(N, L);

    return 0;
}