0Pricing
Competitive Programming Academy · Lekcja

Minimalna liczba usunięć bez nakładania

Zachłanne planowanie z zachowaniem przedziałów kończących się najwcześniej

Minimalna liczba usunięć bez nakładania to bezpłatna lekcja Competitive Programming Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Competitive Programming Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Competitive Programming Academy zawiera 4 lekcji w sumie.

Cel usuwania

Mamy nakładające się przedziały i chcemy usunąć jak najmniej przedziałów, aby żadne z nich już się nie nakładały. Należy zachować ich jak najwięcej. ✂️

Odwrócenie problemu

Usunięcie jak najmniejszej liczby przedziałów jest równoważne zachowaniu jak największej liczby nienakładających się przedziałów. Należy rozwiązać wariant z zachowywaniem, a następnie odjąć liczbę zachowanych przedziałów od n.

To jest wybór aktywności

Zachowanie jak największej liczby nienakładających się przedziałów to w istocie klasyczny problem wyboru aktywności. Ten sam pomysł zachłanny rozwiązuje oba problemy.

Sortowanie według końca

W tym przypadku właściwą kolejnością jest kolejność według czasu zakończenia, a nie rozpoczęcia. Wczesne zakończenie najszybciej zwalnia oś czasu dla kolejnego przedziału, który można zachować.

intervals.sort(key=lambda x: x[1])

Wybór zachłanny

Należy zawsze zachować spośród nadal zgodnych przedziałów ten, który kończy się najwcześniej. Pozostawia on najwięcej miejsca na pozostałe przedziały.

Śledzenie końca ostatniego zachowanego przedziału

Należy przechowywać koniec ostatniego zachowanego przedziału. Kolejny przedział jest zgodny tylko wtedy, gdy jego początek znajduje się na tej granicy lub za nią.

if start >= last_end:
    last_end = end

Zliczanie usunięć

Gdy przedział zaczyna się przed last_end, koliduje z poprzednim, więc należy go odrzucić i zwiększyć licznik usunięć o jeden. W przeciwnym razie należy go zachować.

else:
    removed += 1

Dlaczego wygrywa najwcześniejszy koniec

Dowodzi tego argument wymiany: zastąpienie dowolnego zachowanego przedziału zgodnym przedziałem kończącym się najwcześniej nigdy nie zmniejsza liczby przedziałów, które można zachować.

Obsługa przypadku stykania się

Należy zdecydować, czy [1, 2] i [2, 3] uznaje się za nakładające się. Jeśli wspólny punkt końcowy jest dozwolony, należy użyć testu start >= last_end.

Pełne podejście zachłanne

Należy posortować przedziały według końca, wykonać jedno przejście i zliczyć konflikty. Całkowity koszt wynosi O(n log n) z powodu sortowania oraz pojedynczego liniowego przejścia.

removed = 0; last_end = float('-inf')
for s, e in intervals:
    if s >= last_end: last_end = e
    else: removed += 1

Znany schemat

Ten schemat pozwala zaplanować najwięcej spotkań w jednej sali albo umieścić najwięcej zadań na jednej maszynie. Warto go rozpoznać zawsze, gdy konflikty trzeba zminimalizować.

Szybkie sprawdzenie

Zachłannie zachowywane są nienakładające się przedziały.

Podsumowanie

Minimalna liczba usunięć jest równa n pomniejszonemu o największą liczbę przedziałów, które można zachować. Należy posortować przedziały według końca, zachłannie zachowywać zgodne przedziały kończące się najwcześniej i zliczyć pozostałe. 🚀

Często zadawane pytania

Czy lekcja „Minimalna liczba usunięć bez nakładania” jest bezpłatna?

Tak — pełny tekst „Minimalna liczba usunięć bez nakładania” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Competitive Programming Academy, przejdź na CoddyKit PRO. Kurs Competitive Programming Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Minimalna liczba usunięć bez nakładania”?

Zachłanne planowanie z zachowaniem przedziałów kończących się najwcześniej Ćwiczysz Competitive Programming Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Competitive Programming Academy?

Nie wymagamy żadnego doświadczenia. Competitive Programming Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Minimalna liczba usunięć bez nakładania”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Competitive Programming Academy?

Tak. Każda lekcja Competitive Programming Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Sortowanie przedziałów według początku
  2. Scalanie nakładających się przedziałów
  3. Zamiatanie liniowe dla maksymalnego nakładania
  4. Minimalna liczba usunięć bez nakładania
← Powrót do Competitive Programming Academy