Cod sursa(job #2918286)

Utilizator NutaAlexandruASN49K NutaAlexandru Data 10 august 2022 22:12:46
Problema Lapte Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 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;
}

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;
    }
    int rez=caut();
    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';
    }
}