Cod sursa(job #2918295)

Utilizator NutaAlexandruASN49K NutaAlexandru Data 10 august 2022 22:58:16
Problema Lapte Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <fstream>
#import <algorithm>
#import <vector>
#import <map>
#import <deque>
using namespace std;
vector<pair<int,int>>a;
vector<int>b;
vector<pair<int,int>>v;
int n,k,l;
int ok(int x)
{
    vector<int>dp(k+1,-2e9);
    dp[0]=0;
    for(const auto &c:a)
    {
        vector<int>_dp=dp;
        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;i--)
            {
                if(j<i)
                {
                    if(_dp[i-j]+rest>dp[i])
                    {
                        dp[i]=_dp[i-j]+rest;
                    }
                }
                else
                {
                    if(_dp[0]+rest>dp[i])
                    {
                        dp[i]=rest+_dp[0];
                    }
                }
            }
            j++;
        }
    }
    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];
pair<int,int> sol[101][101];
void rec(int answer) {
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j <= l; j++) {
            dp[i][j] = -2e9;
        }
    }
    dp[0][0] = 0;
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= l; j++) {
            for (int c = 0; c * a[i-1].first <= answer && c <= j; c++) {
                int rem = answer - a[i-1].first * c;
                if (dp[i][j] < dp[i - 1][j - c] + rem / b[i-1]) {
                    dp[i][j] = dp[i - 1][j - c] + rem / b[i-1];
                    sol[i][j] = {c, rem / b[i-1]};
                }
            }
        }
    }
    for (int i = n; i >= 1; i--) {
        v.push_back(sol[i][l]);
        l -= sol[i][l].first;
    }
}
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;
    }
    l=k;
    for(int i=0;i<n;i++)
    {
        b.push_back(a[i].second);
    }
    int rez=caut();
    cout<<rez<<'\n';
    rec(rez);
    reverse(v.begin(),v.end());
    for(auto &c:v)
    {
        cout<<c.first<<' '<<c.second<<'\n';
    }
}