Cod sursa(job #3159969)

Utilizator David2007David Preda David2007 Data 22 octombrie 2023 16:44:17
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
int n,l;
int dp[101][101];
int venit[101][101];
pair <int,int> v[101];
bool verif(int t)
{
    int i,j,k;
    for(j=0;j<=l;j++)
        if(v[1].first*j<=t)
            dp[1][j]=(t-v[1].first*j)/v[1].second;
        else
            dp[1][j]=-1e9;
    for(i=2;i<=n;i++)
        for(j=0;j<=l;j++)
            dp[i][j]=-1e9;
    for(i=2;i<=n;i++)
        for(j=0;j<=l;j++)
            for(k=0;k<=j;k++)
                if(t-v[i].first*(j-k)>=0&&dp[i-1][k]+(t-v[i].first*(j-k))/v[i].second>dp[i][j])
                {
                    dp[i][j]=max(dp[i][j],dp[i-1][k]+(t-v[i].first*(j-k))/v[i].second);
                    venit[i][j]=k;
                }
    return dp[n][l]>=l;
}
int cautbin()
{
    int r=0,pas=1<<10;
    while(pas)
    {
        if(!verif(r+pas))
            r+=pas;
        pas/=2;
    }
    bool x=verif(r+1);
    return r+1;
}
pair <int,int> afis[101];
int main()
{
    freopen("lapte.in","r",stdin);
    freopen("lapte.out","w",stdout);
    int i;
    cin>>n>>l;
    for(i=1;i<=n;i++)
        cin>>v[i].first>>v[i].second;
    int r=cautbin();
    cout<<r<<'\n';
    int start=l;
    for(i=n;i>=1;i--)
    {
        afis[i]={start-venit[i][start],max(0,(r-(start-venit[i][start])*v[i].first)/v[i].second)};
        start=venit[i][start];
    }
    for(i=1;i<=n;i++)
        cout<<afis[i].first<<" "<<afis[i].second<<'\n';
    return 0;
}