10129 2024. 03. 27 19:52:12 kukkerman Benzinkút üzemeltetés (55) cpp17 Elfogadva 55/55 3ms 3972 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 Összpont Teszt Verdikt Idő Memória
base 55/55
1 Elfogadva 0/0 3ms 1816 KiB
2 Elfogadva 0/0 3ms 2000 KiB
3 Elfogadva 3/3 3ms 2072 KiB
4 Elfogadva 3/3 3ms 2296 KiB
5 Elfogadva 3/3 3ms 2504 KiB
6 Elfogadva 3/3 2ms 2596 KiB
7 Elfogadva 3/3 3ms 2724 KiB
8 Elfogadva 3/3 3ms 2972 KiB
9 Elfogadva 3/3 3ms 3056 KiB
10 Elfogadva 3/3 3ms 3056 KiB
11 Elfogadva 3/3 3ms 3044 KiB
12 Elfogadva 3/3 3ms 3292 KiB
13 Elfogadva 4/4 3ms 3396 KiB
14 Elfogadva 4/4 3ms 3644 KiB
15 Elfogadva 5/5 3ms 3744 KiB
16 Elfogadva 6/6 3ms 3972 KiB
17 Elfogadva 6/6 3ms 3960 KiB