Cod sursa(job #2486956)

Utilizator FrostfireMagirescu Tudor Frostfire Data 3 noiembrie 2019 18:17:01
Problema Lapte Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <fstream>
#include <iostream>
#include <cstring>
#include <vector>

using namespace std;

ifstream f("lapte.in");
ofstream g("lapte.out");

int n, l, sp[105];
pair <int, int> v[105], dp[105][105];
vector <int> a[105];
vector <pair <int, int> > sol;

bool okk(int t)
{
    int len;
    memset(dp, 0, sizeof(dp));
    memset(sp, 0, sizeof(sp));
    for(int i=1; i<=n; i++)
        {   a[i].clear();
            int ok = 1, j = 0;
            while(ok)
                {   if(t - j*v[i].first < 0) ok = 0, sp[i] = sp[i-1] + j-1;
                    else a[i].push_back((t - j*v[i].first) / v[i].second);
                    j++;
                }
        }
    len = a[1].size()-1;
    for(int i=0; i<=min(len, l); i++)
        {   dp[1][i].first = a[1][i];
            dp[1][i].second = i;
        }
    for(int i=2; i<=n; i++)
        {   len = a[i].size()-1;
            for(int j=0; j<=min(sp[i], l); j++)
                {   for(int k=0; k<=min(j, len); k++)
                        if(dp[i-1][j-k].first + a[i][k] > dp[i][j].first)
                            {   dp[i][j].first = max(dp[i][j].first, dp[i-1][j-k].first + a[i][k]);
                                dp[i][j].second = k;
                            }
                }
        }
    if(dp[n][l].first >= l)
        {   sol.clear();
            int j = l;
            for(int i=n; i>=1; i--)
                {   sol.push_back(make_pair(dp[i][j].second, a[i][dp[i][j].second]));
                    j -= dp[i][j].second;
                }
            return 1;
        }
    return 0;
}

int main()
{


    f >> n >> l;
    for(int i=1; i<=n; i++)
        f >> v[i].first >> v[i].second;
    int st = 1, dr = 100;
    while(st < dr)
        {   int mij = (st + dr) / 2;
            if(okk(mij)) dr = mij;
            else st = mij + 1;
        }
    g << dr << '\n';
    for(int i=sol.size()-1; i>=0; i--) g << sol[i].first << ' ' << sol[i].second << '\n';
    return 0;
}