Cod sursa(job #3191501)

Utilizator Theo20067Cismaru Theodor-Alexe Theo20067 Data 9 ianuarie 2024 20:20:26
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>
using namespace std;
ifstream fin ("lapte.in");
ofstream fout("lapte.out");
int n,L,i,val,st,dr,mid,sol;
int x[101],y[101],t[105][105],D[105][105];
int verif(int timp)
{
    ///D[i][j]= cantitatea de lapte de tipul b bauta de primii i
    ///j = cantitatea de lapte de tipul a bauta de primii i
    int i,j,k;
    for(i=0;i<=104;i++)
        for(j=0;j<=104;j++)
            t[i][j]=0;
    for(i=1;i<=n;i++)
        for(j=0;j<=L;j++)
            D[i][j]=-1;
    for(i=0;i<=L;i++)
        if(i*x[1]<=timp)
            D[1][i]=(timp-i*x[1])/y[1];

    for(i=2;i<=n;i++)
    {
        for(j=0;j<=L;j++)
        {
            for(k=0;k<=j;k++)
                if(D[i-1][k]!=-1&&(j-k)*x[i]<=timp)
                {
                    int aux=D[i][j];
                    D[i][j]=max(D[i][j],D[i-1][k]+(timp-(j-k)*x[i])/y[i]);
                    if(aux!=D[i][j])
                        t[i][j]=k;
                }
        }
    }
    return D[n][L];
}
void R(int X,int Y)
{
    if(X||Y)
    {
        R(X-1,t[X][Y]);
        fout<<Y-t[X][Y]<<" "<<(sol-(Y-t[X][Y])*x[X])/y[X]<<"\n";
    }
}
int main()
{
    fin>>n>>L;
    for(i=1;i<=n;i++)
        fin>>x[i]>>y[i];
    st=0;
    dr=100;
    while(st<=dr)
    {
        mid=(st+dr)/2;
        val=verif(mid);
        if(val>=L)
        {
            dr=mid-1;
            sol=mid;
        }
        else
            st=mid+1;
    }
    fout<<sol<<"\n";
    verif(sol);
    R(n,L);
    return 0;
}