Cod sursa(job #2717187)

Utilizator CharacterMeCharacter Me CharacterMe Data 6 martie 2021 16:35:37
Problema Lapte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <bits/stdc++.h>
#define a first
#define b second

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

bool test(vector<pair<int, int> > vals, int t, int l)
{

    vector<int> bag(l + 1, -1), newbag(l + 1, -1);
    bag[0] = newbag[0] = 0;

    for (auto it:vals) {
        int vala = t, valb = 0;

        while (vala >= 0 && valb <= t) {

            for (int i = l; i >= 0; --i) {
                if (bag[i] != -1 && i + vala / it.a <= l) {
                    newbag[i + vala / it.a] = max(newbag[i + vala / it.a], bag[i] + valb / it.b);
                }
            }

            int difa, difb;
            difa = vala - (vala % it.a ? vala / it.a * it.a : (vala / it.a - 1) * it.a);
            difb = (valb / it.b + 1) * it.b - valb;
            int dif = min(difa, difb);

            vala -= dif;
            valb += dif;

        }

        bag = newbag;

    }

    return (bag[l] >= l);

}

int main()
{

    int n, l;
    fin >> n >> l;

    vector<pair<int, int> > vals(n);
    for (int i = 0; i < n; ++i) {
        fin >> vals[i].a >> vals[i].b;
    }

    int mn = 1, mx = 100, mid;
    while (mn < mx) {
        mid = (mn + mx) / 2;

        bool is = test(vals, mid, l);
        if (is) {
            mx = mid - 1;
        } else {
            mn = mid + 1;
        }

    }

    fout << mx + 1;

    return 0;
}