Cod sursa(job #2929354)

Utilizator Theo14Ancuta Theodor Theo14 Data 25 octombrie 2022 17:59:08
Problema Lapte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.12 kb
#include<bits/stdc++.h>
#define int long long
#define INF 1000000000
using namespace std;

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

int n,l,dp[105][105];///dp[i][LAtotal]= cantitatea maxima de LBtotal care se poate bea daca se poate sa bei LAtotal cu primele i persoane
struct elem
{
    int x,y;
} v[105];

int verif(int timp)
{
    int i,LAtotal,la,lb;
    for(i=0; i<=n; i++)
        for(LAtotal=0; LAtotal<=l; LAtotal++)
            dp[i][LAtotal]=-INF;
    dp[0][0]=0;
    for(i=1; i<=n; i++)
    {
        for(LAtotal=0; LAtotal<=l; LAtotal++)
        {
            for(la=0; la<=min(la,timp/v[i].x); la++)
            {
                lb=(timp-la*v[i].x)/v[i].y;
                dp[i][LAtotal] = max(dp[i][LAtotal],dp[i-1][max(1LL*0,LAtotal-la)]+lb);
            }
        }
    }
    if(dp[n][l]>=l)
        return 1;
    return 0;
}

void reconstituire(int timp)
{
    int i,LAtotal,la,lb,j;
    for(i=0; i<=n; i++)
        for(LAtotal=0; LAtotal<=l; LAtotal++)
            dp[i][LAtotal]=-INF;
    dp[0][0]=0;
    for(i=1; i<=n; i++)
    {
        for(LAtotal=0; LAtotal<=l; LAtotal++)
        {
            for(la=0; la<=min(la,timp/v[i].x); la++)
            {
                lb=(timp-la*v[i].x)/v[i].y;
                dp[i][LAtotal] = max(dp[i][LAtotal],dp[i-1][max(1LL*0,LAtotal-la)]+lb);
            }
        }
    }
    i=n;
    j=l;
    while(i>=1)
    {
        for(la=0;la<=min(la,timp/v[i].x);la++)
        {
            lb=(timp-la*v[i].x)/v[i].y;
            if(dp[i-1][max(1LL*0,j-la)]+lb==dp[i][j])
            {
                g<<la<<" "<<lb<<'\n';
                i--;
                j-=la;
                break;
            }
        }
    }
}

signed main()
{
    int i,st,dr,retin;
    f>>n>>l;
    for(i=1; i<=n; i++)
        f>>v[i].x>>v[i].y;
    st=1;
    dr=100;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        if(verif(mij))
        {
            retin=mij;
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    g<<retin<<'\n';
    //RECONSTITUIRE
    reconstituire(retin);
    return 0;
}