Cod sursa(job #2443617)

Utilizator florin_salamFlorin Salam florin_salam Data 28 iulie 2019 20:02:06
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

const int NMAX = 105;
const int INF = (1 << 30);
int speeda[NMAX], speedb[NMAX];
pair <int, int> milk[NMAX][NMAX];
int n, l;

bool Check(int xtime)
{
    vector < vector <int> > dp(n + 1, vector <int> (l + 1, -INF));
    dp[0][0] = 0;
    for (int i = 1;i <= n;++i)
        for (int milka = 0;milka <= l && milka * speeda[i] <= xtime;++milka)
        {
            int milkb = (xtime - milka * speeda[i]) / speedb[i];
            for (int j = milka;j <= l;++j)
                if (dp[i][j] < dp[i - 1][j - milka] + milkb)
                {
                    milk[i][j] = make_pair(milka, milkb);
                    dp[i][j] = dp[i - 1][j - milka] + milkb;
                }
        }
    return dp[n][l] >= l;
}

int main()
{
    ifstream fin("lapte.in");
    ofstream fout("lapte.out");
    fin >> n >> l;
    for (int i = 1;i <= n;++i)
        fin >> speeda[i] >> speedb[i];
    int left = 1, right = 100, mid, ans = 0;
    while (left <= right)
    {
        mid = (left + right) / 2;
        if (Check(mid))
        {
            ans = mid;
            right = mid - 1;
        }
        else
            left = mid + 1;
    }
    fout << ans << "\n";
    Check(ans);
    vector < pair <int, int> > vals;
    for (int i = n, pos = l;i >= 1;pos -= milk[i][pos].first, --i)
        vals.push_back(milk[i][pos]);
    reverse(vals.begin(), vals.end());
    for (auto &x : vals)
        fout << x.first << " " << x.second << "\n";
    fin.close();
    fout.close();
    return 0;
}