IV OTWARTE MISTRZOSTWA OPOLA W PROGRAMOWANIU ZESPOŁOWYM OMÓWIENIE ZADAŃ
Problem B – Wędrujący klocek Cechy klocka: Pozycja Położenie, np. lewy, dolny róg Cechy trasy: Pola odwiedzone przez klocek Ruch: Cztery możliwości Pozycja 1 Pozycja 2 Pozycja 3 3 pozycje x 4 kierunki = 12 wariantów
Problem B – Wędrujący klocek Kolejny ruch: Wyznacz nową pozycję Wyznacz nowe położenie klocka Dodaj zajmowane przez klocek pola do listy pól odwiedzonych Pozycja 1 Pozycja 2 Pozycja 3 Pozycja 1 Pozycja 2 Pozycja 3 W, x-=dl_kl E, x++ N, y++ S, y-=dl_kl S, y- - W, x- - E, x+=dl_kl N, y+=dl_kl Ile razy najczęściej klocek znajdował się na jednym polu? Listę odwiedzonych pół przeszukujemy w czasie kwadratowym szukając współrzędnych, które występują najczęściej
Problem C – Zagnieżdżone podzbiory Gramatyka bezkontekstowa definiująca zagnieżdżony zbiór liczb naturalnych: Produkcje gramatyki L { E D Lista E N | L Element listy D , E D |} Rozwinięcie listy N NC | C Liczba naturalna C 0 | 1 | 2 | … | 9 Cyfra {1,2,{3,4,{5,6},7,8}} Przykładowe słowo realizowane przez gramatykę Reguły konstrukcji parsera dla gramatyk bezkontekstowych: A B C A() { B() C() } A B | C A() { Jeżeli (Pierwszy symbol (B) = s1) B() W przeciwnym wypadku jeżeli (Pierwszy symbol (C) = s2 ) C() W przeciwnym wypadku Błędne słowo } A s A() { Jeżeli (symbol = s) Czytaj kolejny symbol W przeciwnym wypadku Błędne słowo }
Problem C – Zagnieżdżone podzbiory Reguły realizacji parsera tej gramatyki – konstrukcja funkcji odpowiadających poszczególnym produkcjom Lista() L { E D { Jeżeli (symbol = { ) Czytaj kolejny symbol W przeciwnym razie Błędne słowo Element_listy() Rozwinięcie_listy() } Element_listy() E N | L Lista() w przeciwnym razie jeżeli (Liczba naturalna) Przeczytaj tę liczbę w przeciwnym razie
Problem C – Zagnieżdżone podzbiory Rozwinięcie_listy() D , E D |} { Jeżeli (symbol = , ) Czytaj kolejny symbol Element_listy() Rozwinięcie_listy() w przeciwnym razie jeżeli (symbol = } ) w przeciwnym razie Błędne słowo } Analizuj_słowo() { Czytaj pierwszy symbol Lista() Jeżeli (przeczytane są wszystkie symbole) Poprawne słowo
Problem A – Terytorium Niech AMN będzie tablicą, w której Jeżeli działka na pozycji (i, j) jest wolna, to A[i, j] = maksymalna powierzchnia wolnego prostokąta o wysokości 1 i skrajnej prawej działce na pozycji (i, j). Jeżeli działka na pozycji (i, j) jest zajęta, to A[i, j] = 0. A = Mając tablicę A łatwo możemy wyznaczyć maksymalny wolny obszar prostokątny o narożniku na pozycji (i, j). Wszystko można robić równocześnie z wczytywaniem danych . Złożoność O(M2N). Jest możliwa optymalizacja ze względu na kolejność M i N.
Problem D – Cięcie kwadratu B(N,0) C(N,N) D(0,N) E(N,yE) F(xF,N) AE = [N; yE] ; EF = [xF – N; N – yE] AE EF N(xF – N) + yE(N – yE) = 0 skąd: xF = N – yE + yE2/N i zadanie już nie jest geometryczne. Szukamy odpowiedzi na pytanie: dla jakich całkowitych i (1 ≤ i ≤ N – 1) wyrażenie i2/N jest całkowite? Jeżeli N ma następujący rozkład na czynniki pierwsze: Odpowiedzią jest 8(r – 1) to i musi być postaci:
Problem E – Wielokąty kratowe Z twierdzenia Picka : W = P – B/2 +1 Wystarczy obliczyć: pole P wielokąta liczbę B punktów kratowych na brzegu wielokąta Uwaga! Wartości iloczynów xiyi+1 lub xi+1yi mogą przekraczać zakres typu long.
Problem F – Jak dojechać? Szukamy takiego v aby: (av4 + bv3 + cv2 + dv) * (s / v) = m tzn. szukamy miejsca zerowego funkcji f(v) = s(av3 + bv2 + cv + d) – m Można zastosować dowolną metodę, np. bisekcji; Newtona.
Problem G – Nieuczciwa gra Załóżmy, że A1 < A2 < A3 oraz B1 < B2 Tylko poniższe przypadki pozwalają zawsze wygrać: 1. A1 < A2 < A3 < B1 < B2 - trzecią kartą może być najniższa spośród pozostałych w talii 2. A1 < B1 < A2 < A3 < B2 - wybieramy najniższą większą od A3 (nie istnieje, gdy A3=51) 3. B1 < A1 < A2 < A3 < B2 - jw. 4. A1 < A2 < B1 < A3 < B2 - wybieramy najniższą większą od A2 (nie istnieje, gdy A2=49) 5. A1 < A2 < B1 < B2 < A3 - jw.
Problem H – Krecia robota Jeśli kopczyki są wierzchołkami grafu, a tunele je łączące – krawędziami, to taki graf jest drzewem. Wniosek: najkrótsza droga jest jedyną drogą łączącą dowolne dwa wierzchołki. Kopczyk poprzedzający nowoutworzony kopczyk możemy nazwać jego rodzicem. Zadanie sprowadza się do znalezienia wspólnego przodka wierzchołków S i T. Sposób numerowania wierzchołków (w grafie skierowanym odpowiada to posortowaniu topologicznemu) pozwala na prosty zapis algorytmu, którego główna część ma postać: if(A[S]<A[T]) {dist+=L[T]; T=A[T]; } else {dist+=L[S]; S=A[S]; } 1 2 4 3 5 8 9 7 Złożoność O(m) , gdzie m – liczba krawędzi.