Cod sursa(job #2545084)

Utilizator AlexPascu007Pascu Ionut Alexandru AlexPascu007 Data 12 februarie 2020 20:20:09
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int i,n,L,st,dr,mid,a[110],b[110],d[110][110],c[110][110];
//d[i][j]=cantitatea maxima de lapte B astfel incat sa se bea exact j litri lapte A de primele i persoane
//c[i][j]=cantitatea de lapte B bauta de persoana i care consuma j litri lapte A
bool verif(int t) { //verifica daca se pot bea minim L litri din fiecare tip in timpul t
    bool ok=false;
    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];
        c[1][j]=j;
    }
    for (int i=2;i<=n;i++)
        for (int j=0;j<=min(L,t/a[i]);j++)
            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];
                        c[i][k+j]=j;
                        if (k+j==L&&d[i][k+j]>=L)
                            ok=true;
                    }
                }
            }
    return ok;
}
void drum(int i,int j) {
    if (i!=0) {
        drum(i-1,j-c[i][j]);
        fout<<c[i][j]<<" "<<(st-a[i]*c[i][j])/b[i]<<"\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)/2;
        if (verif(mid))
            dr=mid-1;
        else
            st=mid+1;
    }
    verif(st);
    fout<<st<<"\n";
    drum(n,L);
    return 0;
}