Dziś jest sobota, 10 stycznia 2009 roku (z kalendarza...)

Noc Kodu

Niesmowite, do czego czasem zdolni są ludzie. Wczoraj o 12.00 mijał termin nadsyłania drogą elektroniczną zgłoszeń do Olimpiady informatycznej. Choć w ostatnich dniach zaprogramowywałem zadanka, w niedzielę sytuacja stała się już krytyczna - o godzinie 16.00 miałem gotowe tylko "Biura", w dodatku wysypujące się przy większych testach (brak pamięci). Chcąc nie chcąc musiałem pójść na całość i w ten sposób ustanowiłem nowy prywatny rekord w programowaniu non-stop: 20 godzin.

Jak nietrudno wyliczyć, skończyłem tuż przed zamknięciem konkursu. Przez ten cały czas skończyłem i zoptymalizowałem "Zapytania" tak, aby mieściły się w sensownych granicach czasu, napisałem "Osie symetrii" z liniową złożonością; zdążyłem jeszcze dopisać naiwne rozwiązanie dla "Drzew", pospiesznie zmienić sposób alokacji pamięci na dynamiczny (tak na wszelki wypadek - ktoś na forum pisał, że mu się program wysypuje przy próbie użycia 100000-elementowej tablicy, a moje Osie alokują aż 16 MB :D). Tuż po tym szybkie pakowanie i... do szkoły :). Po powrocie przespałem 11 godzin do dzisiejszego ranka, ale mimo to i tak dalej byłem senny. Kude, czemu największa mobilizacja przychodzi zawsze tuż przed samym terminem? :) Z Diversity było tak samo - 75% projektu, w tym caluteńki kod PHP, zrobiliśmy w ostatnich sześciu dniach konkursu.

Natomiast ad. samych zadanek z olimpiady: najlepiej wypadły mi, jak już wspomniałem, "Osie symetrii" i "Zapytania". Aby rozwiązać pierwsze, wystarczyło przeanalizować, w jakich sytuacjach figura może mieć oś symetrii. Wydzieliłem trzy obszary moich zainteresowań:

  1. Figura jest wielokątem foremnym - wtedy wypisujemy liczbę od razu.
  2. Figura ma środek symetrii - osi jest przynajmniej dwie i kąt między wszystkimi musi być identyczny.
  3. Figura ma jakąś "tradycyjną" oś symetrii.

Później selekcjonowałem na tej podstawie tzw. "kandydatów do osi symetrii" - wypada ich relatywnie niewielu, bo akurat osie są na tyle specyficzne, że nie można w tej materii wykombinować zbyt dużo. Na koniec wystarczyło sprawdzić ich wszystkich, przy czym jeśli stwierdzono pasowanie dwóch prostopadłych do siebie osi symetrii, to znaczy, że figura ma środek symetrii i do sprawdzenia kolejnych prostopadłych kandydatów trzeba było przejechać coraz mniej wierzchołków.

Zadanie "Zapytania" - nietrudno było zauważyć, że po podzieleniu "a" i "b" przez "d" z własności największego wspólnego dzielnika, problem sprawdzał się do zliczania liczb względnie pierwszych, tj. dane z jednego zapytania mogły być użyte do policzenia całej reszty. Powstawała tutaj dwuwymiarowa tabelka "a x b", ale jak na warunki zadania, nie dało się jej całej wprowadzić do pamięci. Obliczenie pojedynczej kolumny, np. 5a, polega u mnie na określeniu wszystkich czynników pierwszych "a", a następnie zastosowanie do nich zasady włączeń i wyłączeń. Czynniki pierwsze wyznaczałem w czasie liniowym, gdyż w kodzie programu na sztywno wpisałem wszystkie liczby pierwsze do 50000 :D - fajnie to wygląda, nawiasem mówiąc. Obliczenie "a x b" trwało O(min(a, b)) - "b" razy kolumny "a" lub "a" razy kolumny "b". Jednak dla dużych zestawów taka operacja trwała ładnych parę minut, więc dodałem pewną optymalizację. Kiedy program wykrył, że ma do czynienia ze sporym zestawem, obliczał tzw. kamienie milowe - na wstępie dokonywał wyliczenia takich sum "a x b", gdzie "a" i "b" były wielokrotnościami liczby 500. Wtedy program do uzyskania wyniku brał odległość z najbliższego kamienia milowego i co najwyżej doliczał brakujące kolumny. Dzięki temu dla hardcore losowego testu skrócony został do 30 sekund. Nie jest to wprawdzie rozwiązanie wzorcowe, ale tam jestem zadowolony. I tak bym już dalej nie robił, bo mnie szlag mało przy tym zadanku nie trafił :).

Jeszcze "Drzewa" - te zrobiłem algorytmem naiwnym, gdyż zwyczajnie zabrakło mi czasu na sprawdzenie i uzupełnienie mojego pomysłu. Współczynnik był zawsze najniższy dla danych posortowanych, więc trzeba było tak przestawić drzewa, aby uzyskany ciąg był "bardziej posortowany" od pierwszego. Tu miałem patent, żeby wprowadzić go do drzewa czerwono-czarnego według jakiegośtam kryterium tak, żeby pewna, łatwa do odgadnięcia ścieżka zaprowadziła nas do rozwiązania. Drzewo czerwono-czarne jest odmianą binarnego drzewa wyszukiwań, które posiada zawsze wysokość logarytmiczną.

Tyle mojego, czekam na wyniki. Może się dostanę, może nie, ale w każdym razie dotychczasowa zabawa była niezła i bez względu na rezultat dalej będę bawić się algorytmami :). Rada dla uczestników przyszłych edycji: naprawdę, siądźcie do kodowania ZNACZNIE wcześniej, niż ja to zrobiłem :D.

Powrót

Komentarze

Napisał dasko w wtorek, 21 listopada 2006 o 20:13

Tera się Adam pochwali... :p

OSI - zadanie raczej najprostsze, wystarczylo szukac palindromow (kąt,odległość od środka ciezkosci) dla osi przechodzacych przez wierzcholki, (bok,dwa kąty) dla osi przechodzących przez krawędzie. Liniowo, np. za pomocą Algorytmu Manachera.

BIU - nie ma się co wysilać, rozwiązanie w internecie - nietrudno znaleźć pdfa. Aczkolwiek bardzo proste. Liniowo.

DRZ - brut - n*n/2, co się będę, jak najlepsi nie mogli wymyśleć... :p

ATR - pomysł z wzorcówki, złożoność wzorcowa, zle zaimplementowane. Mianowinie O(k*(m log n)+k^2*2^k). Zadanie typowo Topcoderowe, klasyczna rekurencja ze spamietywaniem. Niestety bylem tak pewien szybkosci rozwiazania, ze nie sprawdzialem dla najgorszych testow - za wolno. Wszystko przez to, ze sam mechanizm rekurencji jest wolny. Pięć minut roboty więcej i mielbyśmy dynamika wstępującego, bez rekurencji, na tablicach. :) Poleci pewnie z połowa punktów... :/ Jednak satysfakcja, ze pomysl rozwiazania wzorcowy. ;)

ZAP - mniej wiecej O(n*(sqrt(max(a,b))). Troche kombinatoryki, zasada włączania-wyłączania. Pomysł polega na tym, zeby zobaczyć, jak sie zmienia wartosc podloga(x/a)*podloga(y/a), w miare wzrostu dzielnika a. Około 4,5s dla maksymalnych danych - na moim słabym kompie. ;)

Mam nadzieję, że przejdę... :) Good luck Zyx. :)

Napisał Marcin Miczek w środę, 22 listopada 2006 o 12:23

Ad. "Osie symetrii", punkt 2. Równoległobok, który nie jest rombem ani prostokątem, ma środek symetrii, ale nie ma żadnej osi symetrii.

Napisał Zyx w środę, 22 listopada 2006 o 15:30

Hmmm... środek symetrii w moim rozwiązaniu jest wynikiem istnienia dwóch prostopadłych do siebie osi symetrii, a nie na odwrót :). Tak więc rombu na pewno mi to nie złapie.

Napisał Marcin Miczek w środę, 22 listopada 2006 o 18:12

Środek symetrii to środek symetrii - wiąże się on z obrotem o 180 stopni, który jest złożeniem dwu symetrii osiowych o osiach prostopadłych, ale to nie znaczy, że owe osie muszą być osiami symetrii figury. Nota bene romb ma dwie prostopadłe osie symetrii.

Napisał NuLL w piątek, 24 listopada 2006 o 03:34

20 godzin - light :D

Napisał Bastion w piątek, 24 listopada 2006 o 17:49

Jakieś ciekawe nagrody? Czy to forma sztuki dla sztuki ?

Napisał Zyx w piątek, 24 listopada 2006 o 21:00

Ad. środka - ale jak wspomniałem, tu są wyszukiwani jedynie kandydaci. Więc nawet jeśli tu mi coś nadmiarowo złapie, właściwe sprawdzanie punkt po punkcie całej figury dla danego kandydata rozstrzygnie sprawę. Ad. rombu - racja, mea culpa, o równoległobok mi chodziło :).

Null -> ja tam wolę tego za często nie powtarzać, zwłaszcza gdy mam na drugi dzień iść do szkoły i analizować na polskim wiersz wykorzystujący motyw snu :D.

Bastion -> za dojście do finału jesteś przyjmowany na praktycznie każdą szanującą się uczelnię poza kolejnością jako finalista ogólnopolskiej olimpiady przedmiotowej. Ale nawet jeśli się nie uda, doświadczenie z algorytmami zawsze zostaje.

Strona 1 z 1 :: 1

Skomentuj

NickInformacja
E-mailTylko do użytku wewnętrznego.
WWWNie zapomnij o http://
LayoutNapisz tu, czy widzisz dzienny czy nocny layout.
WpisFormatowanie wiki
Internauto, pamiętaj! Wolność to nie samowola - dbaj o kulturę wypowiedzi oraz dyskusji w sieci.

Na Zyxist.com panuje swoboda wyrażania opinii oraz krytyki pod dowolnym adresem. Jedyny warunek: musi być ona kulturalna i rzeczowa. Na chamstwo, prostactwo lub jawne obrażanie kogokolwiek nie ma tu miejsca i takie komentarze są bardzo szybko usuwane. Jeśli zamierzasz polemizować z treścią wpisu, wpierw uważnie ją przeczytaj.

© Tomasz "Zyx" Jędrzejewski 2005 - 2009 | Wykonanych zapytań: 2 | Serwer wirtualny zapewnia