Cod sursa(job #2769446)

Utilizator marcumihaiMarcu Mihai marcumihai Data 15 august 2021 18:53:31
Problema Lapte Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f ("lapte.in");
ofstream g ("lapte.out");

int n;
int L;
int dp[105][205];
struct copil
{
    int ta, tb;

};
copil a[105];


void verif(int timp)
{

    dp[0][0]=0;

    for(int i=1; i<=n; ++i)
    {

        for(int la=0; la<=L; ++la)
        {
            for(int lapte1=0; lapte1<=la && lapte1<=timp/a[i].ta; ++lapte1)
            {
                int x=lapte1;
                int y=(timp-x*a[i].ta)/a[i].tb;
                if(dp[i][la]< dp[i-1][la-x]+y)
                    dp[i][la]=max(dp[i][la], dp[i-1][la-x]+y);


            }


        }

    }


}


int main()
{
    f>>n;
    f>>L;
    for(int i=1; i<=n; ++i)
    {
        f>>a[i].ta>>a[i].tb;
    }
    int st=1;
    int dr=L;
    int mij=(st+dr)/2;

    int rasp=0;
    while(st<=dr)
    {
        for(int i=0; i<=n; ++i)
            for(int j=0; j<=2*L; ++j)
                dp[i][j]=-99999999;


        verif(mij);
        int ok=0;
        for(int i=L; i<=2*L; ++i)
            if(dp[n][i]>=L)
                ok=1;

        if(ok==1)
        {
            rasp=mij;
            dr=mij-1;
        }
        else
            st=mij+1;

        mij=(st+dr)/2;


    }

    g<<rasp<<"\n";
    for(int i=0; i<=n; ++i)
        for(int j=0; j<=2*L; ++j)
            dp[i][j]=-9999999;

    verif(rasp);

    int ajuns=0;
    for(int i=L; i<=2*L; ++i)
        if(dp[n][i]>=L)
        {
            ajuns=i;
            break;
        }
    copil raspuns[1005];
    for(int i=n-1; i>=0; --i)
    {
        for(int lapte1=0; lapte1<=rasp/a[i+1].ta; ++lapte1)
        {
            int x=lapte1;
            int y=(rasp-x*a[i+1].ta)/a[i+1].tb;
            if(dp[i][ajuns-x]+y==dp[i+1][ajuns])
            {
                ajuns=ajuns-x;
                raspuns[i+1].ta=x;
                raspuns[i+1].tb=y;
                break;
            }
        }
    }
    for(int i=1; i<=n; ++i)
        g<<raspuns[i].ta<<" "<<raspuns[i].tb<<"\n";
    /*
    18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 0 0 0
    22 22 21 21 20 20 19 19 18 18 17 16 15 14 13 12 11 10 9 8 7 6 5
    25 25 24 24 24 24 24 24 23 23 23 23 23 23 22 22 22 22 22 22 21 21 20
    */
    return 0;
}