Cod sursa(job #3161612)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 27 octombrie 2023 17:40:30
Problema Lapte Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <bits/stdc++.h>

#pragma optimize GCC ("Ofast")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

///#include <tryhardmode>
///#include <GODMODE::ON>

using namespace std;

#define int long long

ifstream fin ("lapte.in");
ofstream fout ("lapte.out");

const int NMAX=1e2+5;
const int INF=-1e9;

int dp[NMAX][NMAX]; ///dp[i][j] = nr maxim de litri de lapte b stiind ca bem j litri cu primii i
int viz[NMAX][NMAX];
int n,l;

struct elem{
    int a;
    int b;
}v[NMAX],rez[NMAX];

bool check(int time)
{
    int i,j,k;
    for(i=1;i<=n;i++)
        for(j=0;j<=l;j++)
            viz[i][j]=0,dp[i][j]=INF;
    for(i=0;i<=l;i++)
        if(time-v[1].a*i>=0)
            dp[1][i]=(time-v[1].a*i)/v[1].b;
        else
            dp[1][i]=INF;
    for(i=2;i<=n;i++)
    {
        for(j=0;j<=l;j++)
        {
            for(k=0;k<=j;k++)
            {
                if(time-v[i].a*(j-k)>=0 && dp[i-1][k]+(time-v[i].a*(j-k))/v[i].b>dp[i][j])
                {
                    dp[i][j]=dp[i-1][k]+(time-v[i].a*(j-k))/v[i].b;
                    viz[i][j]=k;
                }
            }
        }
    }
    if(dp[n][l]>=l)
        return true;
    return false;
}

signed main()
{
    ios_base::sync_with_stdio(false);
    fin.tie(NULL);
    fout.tie(NULL);

    int i,j,x;
    fin>>n>>l;
    x=l;
    for(i=1;i<=n;i++)
        fin>>v[i].a>>v[i].b;
    int st=1,dr=-INF,mij,ans=-1;
    while(st<=dr)
    {
        mij=st+dr;
        mij/=2;
        if(check(mij)==true)
        {
            ans=mij;
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    fout<<ans<<"\n";
    for(i=n;i>=1;i--)
    {
        rez[i].a=x-viz[i][x];
        if(ans-(x-viz[i][x])*v[i].a>=0)
            rez[i].b=(ans-(x-viz[i][x])*v[i].a)/v[i].b;
        else
            rez[i].b=0;
        x=viz[i][x];
    }
    for(i=1;i<=n;i++)
        fout<<rez[i].a<<" "<<rez[i].b<<"\n";
    fin.close();
    fout.close();
    return 0;
}