1 / 14
Jun 2020

Informacja na pierwszej stronie pl.spoj.com5:

2020-06-02 17:34:07 Konkurs programistyczny z okazji Dnia Dziecka by Marcin Kasprowicz

Drodzy użytkownicy SPOJ’a, z okazji Dnia Dziecka (wszyscy jesteśmy dziećmy) zapraszamy serdecznie na konkurs programistyczny, który odbędzie się

7 czerwca 2020
w godzinach 16.00 - 19.00. Do rozwiązania przygotowaliśmy Wam sześć zadań o zróżnicowanym poziomie trudności. Serdecznie zapraszamy: Strona konkursu -> https://dd.spoj.com26

  • created

    Jun '20
  • last reply

    Jun '20
  • 13

    replies

  • 909

    views

  • 4

    users

  • 9

    likes

  • 4

    links

@kaspr Marcinie ogromne i gorące podziękowania za zorganizowania wspaniałego konkursu!

Fajne zadania, ale niestety akurat w trakcie konkursu jechałem z Gdyni do Olsztyna. Może kilka zadań bym zrobił, chociaż tego ostatniego Zamiana liter, raczej bym nie zdążył.

Zacząłem oglądać wzorcówki - rozwiązania autora i tutaj apel do adeptów. Starajcie się sami rozwiązać albo chociaż próbować usilnie zanim zaczniecie korzystać z podpowiedzi i “wzorcowych” kodów.

f(x)=ax+b

Mam bardzo podobnie, ale uważam, że zbędne nawiasy klamrowe ‘{’ i ‘}’ zaciemniają i zmniejszają czytelność kodu. Może dlatego, mniej zauważalna jest możliwość zastąpienia:

if (a == 0 && b == 0) {
        cout << 0;
}
else if (a == 0) //w tym miejscu b == 0
       cout << 0;

Niby tylko jedno sprawdzanie mniej [7 a nie 8] ale jednak. Teraz popatrzyłem i zmniejszyłem liczbę porównań do 5 - chyba mniej się nie da. Niby liczy się AC, ale jednak to niby powinien być wzorcowy kod do podglądnięcia i do naśladowania. :slight_smile: A tak to “adepci” nauczą się i będą stosować trochę słabszy kod. W tym zadaniu nie ma to znaczenia, ale w jakimś dużym programie, gdzie takie porównania byłyby używane wielokrotnie lub w wielu miejscach oszczędność mogłabybyć spora. Moja propozycja w kodzie symbolicznym, ale najpierw spróbuj sam!: https://ideone.com/wAjNzu9

Cyfry parzyste i nieparzyste

Zadanie na spostrzegawczość - lub policzenie na kartce papieru ile tych cyfr jest. Od razu pomyślałem, że mógłbym tu wykorzystać szybkie potęgowanie modularne i od razu pomyślałem, że na razie zrobię to w “zwykłej” pętli tak jak to zrobiłeś Marcin we wzorcówce. Dlaczego chociaż w opisie nie wspomniałeś o szybkim potęgowaniu? Może przygotowywujesz trudniejszą, z większym zakresem danych wersję zadania? :wink:

YouTube

To zadanie zrobiłem po swojemu. W opisie jest wspomniane, że można zrobić inaczej - lepiej, więc zamiast rozwiązanie wzorcowe - czy nie powinno się użyć tam oraz w innych miejscach np wersja autorska, albo rozwiązanie autora? bo nazwa rozwiązanie wzorcowe może sugerować adeptom, że to jest najlepsze i do naśladowania rozwiązanie, a przecież akurat w tym zadaniu tak nie jest i sam autor/autorzy to doskonale wiedzą. :wink:

Zamiana liter

Tutaj miałem trochę kłopotów - sprawdzałem, czy przejdzie rozwiązanie naiwne. W ostateczności pożyczyłem drzewko pozycyjne od Stańczyka z Algorytmiki [nie]praktycznej ;-), wyrzucając po drodze makra.

Prawie jak Fibonacci, prawie

No comment - przyjemne zadanko, akurat na bezpośrednie wklepanie w edytorze Spoja.

Posortuj Euklidesa

Tutaj rozwiązanie wzorcowe jest wzorcowe. Ja użyłem vector <pair<int, int>>, a potem od razu sort, aby uniknąć pisania funkcji porównującej, ale moje rozwiązanie to kod lazy programmera :wink:

Dziękuję!

Jeszcze raz. Mariusz, Maciek!. Pomysł konkursu i wykonanie było super i należą się Tobie i Pomocnikom gratulacje i podziękowania. A że frekfencja trochę nie wypaliła, trudno, następnym razem będzie lepiej.

Dzięki za uwagi. Całe omówienie zadań jak i rozwiązania wzorcowe są mojego autorstwa. Nie wykluczam zatem, że rozwiązania wzorcowe Marcina były lepsze, ale nie miałem do nich dostępu. Odnośnie nawiasowania to to jest akurat kwestia bardzo indywidualna. Dla mnie np. bardziej czytelne są te kody gdzie te nawiasy są. Odnośnie szybkiego potęgowania w cyfrach parzystych i nieparzystych to w ogóle mi to nie przyszło do głowy, a pomysł bardzo dobry! Podobnie z kwestią użycia pary w sortowaniu Euklidesa. Niby leniwe, ale też bardzo fajne. Jeżeli chodzi o YouTube to to zadanie celowo było w prostszej wersji. Jeżeli chodzi o temat używania określania rozwiązanie wzorcowe to faktycznie jest ono trochę nadużyciem, bo sugeruje, że to jest najlepsze rozwiązanie, a wcale być tak nie musi. Rozwiązanie autora może tutaj lepiej pasować.

Także podpisuję się pod gratulacjami i podziękowaniami za konkurs.
Bardzo przyjemne podsumowanie weekendu.

Świetne zadanie z zamianą liter. Podziwiam autorów zadań, jak znane zagadnienie potrafią przekuć na bardzo ciekawy i niestandardowy problem.

Dołączam się do gratulacji. Jestem pełen uznania dla autorów za zaangażowanie i ilość włożonej pracy Serce rośnie, gdy widać takich ludzi. Nie dałem rady wziąć udziału (zresztą z pewnością, nie miałbym czym się pochwalić), ale z przyjemnością zająłem się na spokojnie tymi łatwiejszymi. Szczególną przyjemność sprawiło mi zadanie “Cyfry parzyste i nieparzyste”. Pierwsza moja wersja była właściwie taka jak rozwiązanie wzorcowe, ale wymyśliłem pewne usprawnienie (i nie jest to potęgowanie modularne) dzięki, któremu idzie to szybciej. Właśnie przyszło mi do głowy jeszcze jedno usprawnienie dzięki, któremu powinno pójść szybko nawet dla naprawdę długich ciągów np. 10^9 lub dłuższych.

Niech: R = rozmiar danych - długość ciągu
const MODULE = 10^9+7
const czynnik = 5^13
Moje rozwiązanie polega na tym żeby zamiast liczyć (5* wynik) % MODULE liczę (wynik* czynnik) % MODULE. Dlaczego właśnie 5^13?
Bo 5^13*(wynik % MODULE) [MAX = 5^13*1000000006 ~= 1.2x10^18] mieści się w typie long long 2^63 ~= 9.2x10^18.

Niech N = R/13, K = R % 13. Wtedy musimy wykonać N działań typu wynik = (wynik * czynnik) % MODULE oraz tylko K działań typu wynik = (wynik * 5) % MODULE.
Jak widać jest prawie 13 razy mniej działań modulo (oczywiście działania są na większych liczbach, no i zysk jest dla dużych R, dla małych zysk jest niewielki lub go nie ma). Tak wyglądało moje rozwiązanie, z którym dostałem czas 0. Pisałem to o czwartej nad ranem, więc nie zauważyłem oczywistego ulepszenia. Możemy na początku policzyć ile wynosie 5^13 mod a, dać jako stałą i wykorzystywać w dalszych rachunkach. To dla dużych rozmiarów znów znacznie przyspieszy działania. Zresztą dla NAPRAWDĘ dużych rozmiarów można tę metodę zastosować kaskadowo.
Uff, nie wiem czy te wyjaśnienia są wystarczająco przejrzyste :slight_smile: Podać to jeszcze w kodzie lub pseudokodzie?

Jednak w tekście było znalazło się parę pomyłek czy nieścisłości. Zostały wykryte przez Narbeja za co mu serdecznie dziękuję.

Jeżeli ma to służyć do cope paste i AC to jak najbardziej w pełnym działającym kodzie. :wink:

Jeżeli do zobrazowania opisu, to pewnie pseudokod byłby wystarczający i bezpieczniejszy.

Jest jeszcze opcja, w kodzie ale z “ucięciem” wszystkiego powyżej, łącznie z int main () {, a także wycięcie deklaracji zmiennych i innych mniej istotnych rzeczy, i spowodowanie ‘popsucie’ copy/paste. :wink:

Ale oczywiście to twoja decyzja.

Nie wiem czy rozumiem ten powyższy fragment, jeszcze się nie wczytałem, ale oczywista jest korzyść ze zmniejszenia ilości dzieleń.
Czy nie powinien on brzmieć:
zamiast liczyć mod a liczyć mod 5^13?

Jeżeli tak, to wydaje mi się, że lepiej by było użyć innej nazwy np. MOD_ORG = 10^9+7, lub używać pogrubienia.

Nie, tutaj musimy liczyć mod a bo to jest narzucone przez autora. Jak będę miał chwilkę czasu, to podam tutaj istotny fragment kodu. Nie wytnę go ze swojego rozwiązania i nie podam tak na forum, bo nie pisałem go zbyt ładnie… (jak wspomniałem czwarta nad ranem, jak w piosence :slight_smile: ). Chyba, że chcesz na priv, ale to już na własną odpowiedzialność…

Podoba mi się Twoje rozwiązanie. Idea trochę przypomina mi koncepcje grupowania cyfr po 9 w implementacji własnej arytmetyki dużych liczb.

Tak, ale napisałeś mod 5, a nie mod a, chyba, że pisałeś o czwartej nad ranem.

Po drugie autor narzucił wartoś, a nie to jak nazwiemy zmienną :wink:

Eeeech…, masz rację. Pierwsze zdanie było bez sensu. Poprawiłem je, teraz jest chyba lepiej :joy:

Suggested Topics

Topic Category Replies Views Activity
Konkursy 6 205 Mar 25

Want to read more? Browse other topics in Konkursy or view latest topics.