Cod sursa(job #2918296)

Utilizator NutaAlexandruASN49K NutaAlexandru Data 10 august 2022 23:02:31
Problema Lapte Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.85 kb
#include <fstream>
#import <algorithm>
#import <vector>
#import <map>
#import <deque>
#import <cassert>
using namespace std;
vector<pair<int,int>>a;
vector<int>sol;
int n,k,l;
int ok(int x)
{
    vector<int>dp(k+1,-2e9);
    dp[0]=0;
    vector<vector<int>>h(k+1);
    for(auto &c:h)
    {
        c.resize(n);
    }
    int nvm=0;
    for(const auto &c:a)
    {
        vector<int>_dp=dp;
        vector<vector<int>>_h=h;
        dp=vector<int>(k+1,0);
        int j=0;
        while(c.first*j<=x)
        {
            int rest=(x-c.first*j)/c.second;
            for(int i=k;i>=0;i--)
            {
                if(j<i)
                {
                    if(_dp[i-j]+rest>dp[i])
                    {
                        dp[i]=_dp[i-j]+rest;
                        h[i]=_h[i-j];
                        h[i][nvm]=j;
                    }
                }
                else
                {
                    if(_dp[0]+rest>dp[i])
                    {
                        dp[i]=rest+_dp[0];
                        h[i]=_h[0];
                        h[i][nvm]=j;
                    }
                }
            }
            j++;
        }
        nvm++;
    }
    if(dp[k]>=k)
    {
        sol=h[k];
        return 1;
    }
    return 0;
}
int caut()
{
    int rez=-1,st=1,dr=100;
    while(st<=dr)
    {
        int m=(st+dr)/2;
        if(ok(m))
        {
            dr=m-1;
            rez=m;
        }
        else
        {
            st=m+1;
        }
    }
    return rez;
}





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;
}

main()
{
    ifstream cin("lapte.in");
    ofstream cout("lapte.out");
    cin>>n>>k;
    a.resize(n);
    for(int i=0;i<n;i++)
    {
        cin>>a[i].first>>a[i].second;
        v[i+1]=a[i];
    }
    l=k;
    int rez=caut();
    int rez2=cautbin();
    assert(rez==rez2);
    cout<<rez<<'\n';
    for(int i=0;i<n;i++)
    {
        int c=sol[i];
        cout<<c<<' '<<(rez-c*a[i].first)/a[i].second<<'\n';
    }
}