101292024-03-27 19:52:12kukkermanBenzinkút üzemeltetés (55)cpp17Elfogadva 55/553ms3972 KiB
#include <iostream>
#include <vector>
#include <algorithm>

struct Pihenohely {
    int tav;
    int haszon;
};
using Pihenohelyek = std::vector<Pihenohely>;

void beolvas(std::istream &be, Pihenohelyek &pihenok, int &k) {
    int n;
    be >> n >> k;

    pihenok.resize(n);
    for (auto &p: pihenok) {
        be >> p.tav >> p.haszon;
    }
}

std::vector<int> hatotavon_kivuliek_kiszamitasa(const Pihenohelyek &pihenok, int k) {
    const auto n = static_cast<int>(pihenok.size());

    std::vector<int> elso_hatotavon_kivuli(n);

    int i = 0;
    for (auto j = 0; j < n; j++) {
        while (pihenok[j].tav - pihenok[i].tav >= k) {
            i++;
        }
        elso_hatotavon_kivuli[j] = i - 1;
    }

    return elso_hatotavon_kivuli;
}

struct Elrendezes {
    int haszon;
    std::vector<int> kutak;
};

struct Reszmegoldas {
    int haszon = -1;
    bool telepitve = false;
};
using Dp = std::vector<Reszmegoldas>;

Elrendezes optimalis_elrendezes(const Dp &dp, const std::vector<int> &elso_hatotavon_kivuli) {
    const auto n = elso_hatotavon_kivuli.size();

    Elrendezes elrendezes;
    elrendezes.haszon = dp[n].haszon;

    int i = n - 1;
    while (i != -1) {
        if (dp[i + 1].telepitve) {
            elrendezes.kutak.push_back(i);
            i = elso_hatotavon_kivuli[i];

        } else {
            --i;
        }
    }

    std::reverse(elrendezes.kutak.begin(), elrendezes.kutak.end());
    return elrendezes;
}

Elrendezes kutak_dp_bottom_up(const Pihenohelyek &pihenok, int k) {
    const auto n = static_cast<int>(pihenok.size());
    const auto elso_hatotavon_kivuli = hatotavon_kivuliek_kiszamitasa(pihenok, k);

    Dp dp(n + 1);
    dp[0].haszon = 0;
    for (int i = 0; i < n; i++) {
        const auto telepit_haszon = dp[elso_hatotavon_kivuli[i] + 1].haszon + pihenok[i].haszon;
        const auto nem_telepit_haszon = dp[i].haszon;

        dp[i + 1] = { std::max(telepit_haszon, nem_telepit_haszon),
                      nem_telepit_haszon < telepit_haszon };
    }

    return optimalis_elrendezes(dp, elso_hatotavon_kivuli);
}

int main() {
    using std::cout;

    Pihenohelyek pihenok;
    int k;
    beolvas(std::cin, pihenok, k);

    const auto opt_elrendezes = kutak_dp_bottom_up(pihenok, k);
    cout << opt_elrendezes.haszon << '\n';
    cout << opt_elrendezes.kutak.size();
    for (const auto p_index: opt_elrendezes.kutak) {
        cout << ' ' << p_index + 1;
    }
    cout << '\n';

    return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base55/55
1Elfogadva0/03ms1816 KiB
2Elfogadva0/03ms2000 KiB
3Elfogadva3/33ms2072 KiB
4Elfogadva3/33ms2296 KiB
5Elfogadva3/33ms2504 KiB
6Elfogadva3/32ms2596 KiB
7Elfogadva3/33ms2724 KiB
8Elfogadva3/33ms2972 KiB
9Elfogadva3/33ms3056 KiB
10Elfogadva3/33ms3056 KiB
11Elfogadva3/33ms3044 KiB
12Elfogadva3/33ms3292 KiB
13Elfogadva4/43ms3396 KiB
14Elfogadva4/43ms3644 KiB
15Elfogadva5/53ms3744 KiB
16Elfogadva6/63ms3972 KiB
17Elfogadva6/63ms3960 KiB