Cod sursa(job #2367505)

Utilizator radugheoRadu Mihai Gheorghe radugheo Data 5 martie 2019 11:07:44
Problema Lapte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <fstream>

using namespace std;

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

int n, L, i, st, dr, mid;
int a[105], b[105];
int d[105][105], t[105][105];

//d[i][j] = cantitatea maxima de lapte de tip B daca primii i consuma fix j litri de tip A
//t[i][j] = cantitatea de tip B pe care o bea persoana i daca consuma j litri de tip A

inline bool check (int p){
    int i, j, k;
    bool ok = false;
    for (i=1; i<=n; i++){
        for (j=0; j<=L; j++){
            d[i][j] = -1;
        }
    }
    for (j=0; j<=min (L, p/a[1]); j++){
        d[1][j] = (p-a[1]*j)/b[1];
        t[1][j] = j;
    }
    for (i=2; i<=n; i++){
        for (j=0; j<=min (L, p/a[i]); j++){
            for (k=0; k<=L-j; k++){
                if (d[i-1][k] != -1){
                    if (d[i][k+j] < d[i-1][k] + (p-a[i]*j)/b[i]){
                        d[i][k+j] = d[i-1][k] + (p-a[i]*j)/b[i];
                        t[i][k+j] = j;
                        if (k + j == L && d[i][k+j] >= L){
                            ok = true;
                        }
                    }
                }
            }
        }
    }
    return ok;
}

inline void path (int n, int L){
    if (n > 0){
        path (n-1, L - t[n-1][L]);
        fout << t[n][L] << " " << (st - t[n][L]*a[n])/b[n] << "\n";
    }
}

int main(){
    fin >> n >> L;
    for (i=1; i<=n; i++){
        fin >> a[i] >> b[i];
    }
    st = 1, dr = L*(a[1] + b[1]);
    while (st <= dr){
        mid = st + (dr - st)/2;
        if (check (mid)){
            dr = mid - 1;
        }
        else{
            st = mid + 1;
        }
    }
    fout << st << "\n";
    check (st);
    /*for (i=1; i<=n; i++){
        for (int j=0; j<=st; j++){
            fout << t[i][j] << " ";
        }
        fout << "\n";
    }*/
    path (n, L);
    return 0;
}