Cod sursa(job #2859627)

Utilizator bem.andreiIceman bem.andrei Data 1 martie 2022 17:45:22
Problema Lapte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>

using namespace std;
ifstream r ("lapte.in");
ofstream w ("lapte.out");
struct str
{
    int x, y;
} v[105], s[105];
int dp[105][105], rec[105][105];
int main()
{
    int n, t, l;
    r>>n>>l;
    for(int i=1; i<=n; i++)
    {
        r>>v[i].x>>v[i].y;
    }
    int step=64, pos=0;
    while(step>0)
    {
        t=step+pos;
        for(int i=0;i<=n;i++){
            for(int j=0;j<=l;j++){
                dp[i][j]=-0x3f3f3f3f;
            }
        }
        dp[0][0]=0;
        for(int i=1;i<=n;i++){
            for(int j=0;j<=l;j++){
                for(int h=0;h*v[i].x<=t && h<=j;h++){
                    dp[i][j]=max(dp[i][j],dp[i-1][j-h]+(t-v[i].x*h)/v[i].y);
                }
            }
        }
        if(dp[n][l]<l)
        {
            pos+=step;
        }
        step/=2;
    }
    w<<pos;
    for(int i=0;i<=n;i++)
    {
        for(int j=0;j<=l;j++)
        {
            dp[i][j]=-0x3f3f3f3f;
        }
    }
    dp[0][0]=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=l;j++)
        {
            for(int h=0;h*v[i].x<=t&&h<=j;h++)
            {
                if(dp[i][j]<dp[i-1][j-h]+(t-v[i].x*h)/v[i].y)
                {
                    rec[i][j]=j-h;
                    dp[i][j]=max(dp[i][j],dp[i-1][j-h]+(t-v[i].x*h)/v[i].y);
                }
            }
        }
    }
    for(int i=n;i>0;i--)
    {
        s[i].x=l-rec[i][l];
        s[i].y=(pos-s[i].x*v[i].x)/v[i].y;
        l=rec[i][l];
    }
    for(int i=1;i<=n;i++){
        w<<"\n"<<s[i].x<<" "<<s[i].y;
    }
    return 0;
}