Cod sursa(job #3255924)

Utilizator paull122Paul Ion paull122 Data 12 noiembrie 2024 18:45:20
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <bits/stdc++.h>

#define VMAX 100000
#define NMAX 100
#define LOG 30
#define INF (long long)(1e9)
#define MOD 1000000007

#define ll  long long int



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

pair<int,int> dp[NMAX+1][NMAX+1];
int a[NMAX+1],b[NMAX+1];
int n,l;
bool check(int m)
{
     for(int i=1;i<=l;i++)
     {
         dp[0][i]={-INF,0};
     }
     dp[0][0] = {0,0};
     for(int i=1;i<=n;i++)
     {
         for(int j=0;j<=l;j++)
         {
             dp[i][j] = {-INF,0};
             for(int j1=0;j1<=j && j1*a[i]<=m;j1++)
             {
                 if(dp[i][j].first < dp[i-1][j-j1].first + (m-j1*a[i])/b[i])
                 {
                     dp[i][j].first = dp[i-1][j-j1].first + (m-j1*a[i])/b[i];
                     dp[i][j].second = j1;
                 }
             }
         }
     }

     return dp[n][l].first>=l;
}

int main()
{
    /// dp[A] = nr maxim de B cand am baut A
    fin >> n >> l;
    for(int i=1;i<=n;i++)
    {
        fin >> a[i] >> b[i];
    }
    int st=1,dr=100;
    while(st<=dr)
    {
        int m = (st+dr)/2;
        if(check(m))
        {
            dr=m-1;
        }
        else
        {
            st=m+1;
        }
    }
    fout << st << '\n';
    int m = st;
    for(int i=1;i<=l;i++)
     {
         dp[0][i]={-INF,0};
     }
    dp[0][0] = {0,0};
     for(int i=1;i<=n;i++)
     {
         for(int j=0;j<=l;j++)
         {
             dp[i][j] = {-INF,0};
             for(int j1=0;j1<=j && j1*a[i]<=m;j1++)
             {
                 if(dp[i][j].first < dp[i-1][j-j1].first + (m-j1*a[i])/b[i])
                 {
                     dp[i][j].first = dp[i-1][j-j1].first + (m-j1*a[i])/b[i];
                     dp[i][j].second = j1;
                 }
             }
         }
     }
    vector<int> res;
    int curr=l;
    for(int i=n;i>=1;i--)
    {
        res.push_back(dp[i][curr].second);
        curr = curr - dp[i][curr].second;
    }
    reverse(res.begin(),res.end());
    for(int i=0;i<res.size();i++)
    {
        fout << res[i] << " " << (m-res[i]*a[i+1])/b[i+1] << "\n";
    }
}