• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zadanie Labirynty OIJ

Object Storage Arubacloud
0 głosów
110 wizyt
pytanie zadane 4 marca 2023 w Algorytmy przez pasjonat_algorytmiki Pasjonat (19,540 p.)

Pisałem dzisiaj drugi etap OIJ-a, i mam delikatne wątpliowści czy mój kod jest dobry. Przekopiuję treść ręcznie, bo nie jest jeszcze dostępna na sio2.

Treść:

Bajtek wraz z kolegami pisze swoją pierwszą grę komputerową. Gra jest osadzona w środowisku fantasy i polega na
uratowaniu księżniczki. Żeby ją uratować, gracz musi przechodzić labirynty oraz pokonywać potwory.
Gra składa się z  plansz, które trzeba przechodzić po kolei. Każda polega na przejściu labiryntu, na końcu którego
znajduje się skrzynia skarbów, bądź potwór. Jeśli na końcu planszy znajduje się skrzynia skarbów, gracz ją otwiera i zdobywa
pewną liczbę diamentów. Jeśli plansza kończy się potworem, gracz musi go pokonać, żeby ukończyć planszę. Każdy potwór
jest bardzo wytrzymały i żeby go pokonać gracz potrzebuje specjalnego miecza, którego może kupić u handlarza, który
znajduje się pod koniec każdej planszy. Żeby kupić miecz, gracz musi zapłacić określoną liczbę diamentów. Każdy potwór
jest jest wrażliwy na inny miecz, gracz nie zdobywa diamentów w inny sposób niż przez otwieranie skrzyń oraz nie wydaje
ich w inny sposób niż na zakup mieczy. Gracz zaczyna grę z zerową liczbą diamentów.
Gra wyróżnia się spośród innych mechaniką zamiany. Gracz może zamienić każdego potwora w skrzynię skarbów, w
której będzie tyle diamentów, ile kosztuje miecz niezbędny do pokonania tego potwora. Gracz może użyć tej możliwości na
każdej planszy, która kończy się potworem.
Bajtek zaprojektował już plansze, teraz pracuje nad osiągnięciami. Jedno z planowanych osiągnięć polega na przejściu
gry używając najmniejszej liczby zamian. Niestety, Bajtek nie wie, jaka to liczba. Pomóż mu i napisz program, którego
będzie mógł użyć, żeby dowiedzieć się, ile najmniej zamian potrzeba do ukończenia gry.

Wejście:

W pierwszym wierszu wejścia znajduje się jedna liczba naturalna  (1 ≤  ≤ 500 000) określająca liczbę plansz w grze
Bajtka. W drugim (ostatnim) wierszu wejścia znajduje się ciąg  liczb całkowitych  (−109 ≤  ≤ 109
) pooddzielanych
pojedynczymi odstępami opisujące jak kończą się kolejne plansze. Jeśli liczba 
jest nieujemna, to na końcu -tej planszy
znajduje się skrzynia skarbów, która zawiera  diamentów. Jeśli 
jest ujemne, na końcu planszy znajduje się potwór,
którego można pokonać tylko mieczem, który kosztuje − diamentów

Wyjście:

Twój program powinien wypisać na wyjście dokładnie jedną nieujemną liczbę całkowitą – minimalną liczbę zamian
niezbędną do ukończenia gry.

No i pomysł miałem taki, żeby na multisecie trzymać ujemne, te które mogę zjeść i jak jak A[i] >= 0, to bilans += A[i], a jak bilans jest < 0, to jem od największych dopóki bilans jest < 0. O(N lg N).

kod:

#include <iostream>
#include <vector>
#include <set>

using namespace std;
typedef long long ll;

int n = 0, wczytana_liczba = 0, wyn = 0;
ll masa = 0;
vector<int> liczby;
multiset<int> do_zjedzenia;

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin >> n;
    for (int i = 0; i < n; ++i)
    {
        cin >> wczytana_liczba;
        liczby.push_back(wczytana_liczba);
    }

    for (int i = 0; i < n; ++i)
    {
        if (liczby[i] >= 0)
            masa += (ll)liczby[i];
        else
        {
            ll val = abs((ll)liczby[i]);
            masa -= val;
            do_zjedzenia.insert((ll)2 * val);
            while (masa < 0)
            {
                wyn++;
                masa += *do_zjedzenia.rbegin();
                do_zjedzenia.erase(do_zjedzenia.lower_bound(*do_zjedzenia.rbegin()));
            }
        }
    }

    cout << wyn << '\n';

    return 0;
}

Widzi ktoś jakiś błąd w pomyśle / kodzie?

Z góry dziekuję za pomoc i poświęcony czas!

1 odpowiedź

0 głosów
odpowiedź 4 marca 2023 przez pasjonat_algorytmiki Pasjonat (19,540 p.)
Dostaliśmy już wyniki, jest dobre, przechodzi na 100.
1
komentarz 4 marca 2023 przez Whistleroosh Maniak (56,980 p.)
gratulacje!
komentarz 4 marca 2023 przez pasjonat_algorytmiki Pasjonat (19,540 p.)
;)))

Podobne pytania

0 głosów
1 odpowiedź 189 wizyt
0 głosów
1 odpowiedź 112 wizyt
pytanie zadane 16 czerwca 2023 w Algorytmy przez nerfiko Nowicjusz (170 p.)
0 głosów
1 odpowiedź 169 wizyt
pytanie zadane 24 kwietnia 2023 w Algorytmy przez pasjonat_algorytmiki Pasjonat (19,540 p.)

92,568 zapytań

141,420 odpowiedzi

319,622 komentarzy

61,954 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...