Cod sursa(job #2367013)

Utilizator mariusn01Marius Nicoli mariusn01 Data 5 martie 2019 00:01:02
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <fstream>
#define DIM 102
using namespace std;
int D[DIM][DIM];
int T[DIM][DIM];
int a[DIM], b[DIM];

int n, L, st, dr, mid;
ifstream fin ("lapte.in");
ofstream fout("lapte.out");

int ok(int t) {
/**
D[i][j] = numarul maxim de litri de tip b care pot fi bauti asa
incat sa se poata bea exact j litri de tip a de primele i persoane
**/

    int ret = 0;
    for (int i=1;i<=n;i++)
        for (int j=0;j<=L;j++)
            D[i][j] = -1;

    for (int j=0;j<=min(L, t/a[1]);j++) {
        D[1][j] = (t-a[1]*j)/b[1];
        T[1][j] = j;
    }

    for (int i=2;i<=n;i++) {
        for (int j=0;j<=min(L, t/a[i]);j++) {
            /// persoana i bea j litri de lapte de tip a
            for (int k=0;k<=L-j;k++)
                if (D[i-1][k] != -1) {
                    if (D[i][k+j] < D[i-1][k] + ( (t-a[i]*j)/b[i] )) {
                        D[i][k+j] = D[i-1][k] + ( (t-a[i]*j)/b[i] );
                        T[i][k+j] = j;
                        if (k+j == L && D[i][k+j] >= L) {
                            ret = 1;
                        }
                    }
                }
        }
    }
    return ret;
}

void drum(int n, int L) {
    if (n) {
        drum(n-1, L-T[n][L]);
        fout<<T[n][L]<<" "<<(st-a[n]*T[n][L])/b[n]<<"\n";
    }
}

int main (){


    fin>>n>>L;
    for (int i=1;i<=n;i++) {
        fin>>a[i]>>b[i];
    }

    st = 1; dr = L*(a[1] + b[1]);
    while (st <= dr) {
        int mid =(st+dr)/2;
        if (ok(mid))
            dr = mid-1;
        else
            st = mid+1;
    }

    ok(st);
    fout<<st<<"\n";
    drum(n, L);
    return 0;
}