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

Zadanie Szczyty

Object Storage Arubacloud
0 głosów
195 wizyt
pytanie zadane 27 lipca 2020 w C i C++ przez wojtek_suchy Mądrala (6,880 p.)

Cześć mam takie zadanie

Mateusz pakuje się na wyprawę do Gór Bajtockich. Ma już mapę trasy, po której będzie się poruszał. Jest to n kolejnych miejsc położonych na pewnych wysokościach. Szczytem nazwiemy miejsce, dla którego dwa sąsiednie miejsca są niżej położone. Zakładamy, że pierwsze i ostatnie miejsce nie jest szczytem. Mateusz chce podzielić całą trasę na spójne odcinki o takiej samej liczbie miejsc. W każdym odcinku chciałby ustawić dokładnie jedną flagę. Postanowił, że flagi może rozmieszczać tylko na szczytach. Pomóż Mateuszowi i oblicz, ile maksymalnie flag będzie mógł rozmieścić.

Wejście W pierwszym wierszu wejścia jest jedna liczba całkowita n (1 <= n <= 500 000) oznaczająca liczbę miejsc na trasie. Kolejny wiersz wejścia zawiera n liczb całkowitych t0, t1, . . . , tn−1 (1 <= ti <= 109 ), gdzie ti oznacza wysokość i-tego miejsca. Wyjście Pierwszy i jedyny wiersz wyjścia powinien zawierać jedną liczbę całkowitą równą maksymalnej liczbie flag, które może rozmieścić Mateusz.

MOJ KOD

Tutaj sprawdzam poprawność

Pomoże mi ktoś znaleźć błąd ? :D

1 odpowiedź

+1 głos
odpowiedź 27 lipca 2020 przez Whistleroosh Maniak (56,980 p.)
wybrane 27 lipca 2020 przez wojtek_suchy
 
Najlepsza

Masz błąd w implementacji tablicy sum prefiksowych. Jej rozmiar powinien wynosić n+1, a nie n. I teraz suma elementów od indeksu 0 do indeksu i znajduje się w tablicy pref pod indeksem i+1, a nie pod indeksem i.

Czyli w pętli w której obliczasz tablicę pref musisz zamienić:

pref[i] = pref[i-1] + 1;

na:

pref[i+1] = pref[i] + 1;

Analogicznie musisz poprawić linię 7,  22, 24. Z czego linię 7 zamieniasz na to:

if (pref[i+dz] - pref[i] < 1) return false; 
komentarz 27 lipca 2020 przez wojtek_suchy Mądrala (6,880 p.)
Mógbyś wytłumaczyć mi dlaczego wcześniejsze tworzenie tablicy pref było błędne ? dlaczego musi być ta pierwsza zerowa wartość ?
komentarz 27 lipca 2020 przez Whistleroosh Maniak (56,980 p.)
Ogólnie istnieją dwie metody tworzenia tablicy sume prefiskowych. W piewszej sumę na przedziale [l, r] liczy się wzorem pref[r+1]-pref[l], a w drugiej wzorem pref[r]-pref[l-1]. Ja akurat wybrałem tę pierwszą wersję.

W pierwszej wersji pref[i+1] oznacza sumę elementów o indeksach 0...i. I teraz jeżeli chcesz obliczyć sumę na przedziale [l, r] to wiemy, że pref[r+1] zawiera sumę elementów od 0 do r, a pref[l] zawiera sumę elemntów od 0 do l-1. No a dlaczego pref[l] a nie pref[l+1]? Bo żeby obliczyć sumę na przedziale [l, r] musisz od sumy elementów od 0 do r odjąć sumę elementów od 0 do jednego wcześniej niż l, czyli l-1.

I teraz gdybyś chciał liczyć sumę elementów od indeksu 0 do indeksu 0 to znowu musisz odjąć od sumy elemntów [0, 0] sumę elemntów od 0 do jeden przed 0, tylko że taki indeks nie istnieje. Dlatego musimy wymusić takie przesunięcię, w którym suma na przedziale [0, i] znajduje się w pref[i+1] i dzięki temu pref[0] zawiera ten indeks o jeden przed 0.

Podobne pytania

+1 głos
1 odpowiedź 111 wizyt
pytanie zadane 29 marca w C i C++ przez Dani Obywatel (1,450 p.)
0 głosów
0 odpowiedzi 129 wizyt
0 głosów
1 odpowiedź 632 wizyt
pytanie zadane 30 maja 2022 w C i C++ przez polandonion Mądrala (7,100 p.)

92,632 zapytań

141,500 odpowiedzi

319,879 komentarzy

62,012 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!

...