Zadania
Transkrypt
Zadania
Siłacze Raz na cztery lata, 29 lutego, rozgrywane są zawody sportowe w siłowaniu się na rękę. Cieszą się one ogromną popularnością. Do każdej edycji zgłasza się bardzo dużo zawodników. Na tyle dużo, że organizatorzy mają często problem ze zdecydowaniem o systemie rozgrywek. Najbardziej sprawiedliwy system – każdy z każdym – nie może być zastosowany, gdyż nie ma żadnych szans, aby zawody rozegrały się w ciągu jednego dnia. Dlatego przyjmuje się system, w którym rozgrywa się tylko z góry określoną liczbę rund. Nie dopuszcza się także, aby dwaj Ci sami zawodnicy walczyli ze sobą więcej niż w jednym meczu. W każdej rundzie startują wszyscy zawodnicy podzieleni na pary zgodnie z zasadą, że najlepszy (w sensie najwyżej sklasyfikowany zawodnik po dotychczas rozegranych rundach) do danej rundy zawodnik startuje z drugim najlepszym zawodnikiem (o ile to możliwe, a może być niemożliwe jeśli już ze sobą walczyli lub jeśli nie można sparować innych par zgodnie z zasadami), trzeci z czwartym, itd. Jeśli z rankingu po pewnej rundzie wynika sytuacja, że w kolejnej rundzie mają spotkać się zawodnicy, którzy już ze sobą walczyli, wówczas dla lepszego z tej pary zawodnika dolosowuje się kolejnego najlepszego jeszcze niesparowanego w danej rundzie zawodnika, z którym tenże zawodnik nie walczył. Mecze rozgrywane są do 5 zwycięskich partii. Kryteria ustalania rankingu Ranking zawodników jest zawsze ustalany od zawodnika najlepszego do najgorszego. A) Przed pierwszą rundą ranking jest zgodny z numerem zawodnika. Zawodnik numer 1 jest pierwszy (najlepszy), numer 2 jest drugi, itd. B) Po kolejnych rundach o pozycji zawodnika w rankingu decyduje kolejno: a) Liczba wygranych meczów b) Różnica pomiędzy liczbą wygranych partii, a liczbą partii przegranych c) Ilość partii wygranych d) Niższy numer startowy Dane wejściowe Pierwsza linia zawiera jedną liczbę parzystą n (2 ≤ n ≤ 1000) oznaczającą ilość zawodników zgłoszonych do turnieju. Zawodnicy otrzymują numery startowe od 1 do n. Druga linia zawiera jedną liczbę m (1 ≤ m ≤ 20 oraz m < n) oznaczającą ilość rund, które będą rozegrane w turnieju. Można założyć, że zadana ilość rund gwarantuje możliwość rozlosowania par. Kolejne m serii po n/2 linii każda zawiera po dwie liczby naturalne rozdzielone spacją oznaczające wynik osiągnięty w rywalizacji danej pary. W każdej serii linii, linie są wynikami meczów par posortowanych rosnąco względem pozycji lepszych zawodników z par w aktualnym rankingu. W jednej linii, pierwsza liczba jest liczbą wygranych partii przez wyżej sklasyfikowanego zawodnika, druga liczba jest liczbą wygranych partii przez słabszego zawodnika. Dane wyjściowe Ranking zawodników osiągnięty po rozegraniu wszystkich zadeklarowanych rund, to znaczy n linii zawierających po 4 liczby naturalne rozdzielone spacją oznaczające kolejno numer startowy zawodnika, ilość wygranych meczów, ilość wygranych partii oraz ilość partii przegranych. Przykład: Dane wejściowe – tekst (wynik pary numer numer) nie występuje w danych wejściowych 8 5 5 0 (wynik pary 1 2) 5 0 (wynik pary 3 4) 5 0 (wynik pary 5 6) 5 0 (wynik pary 7 8) 5 0 (wynik pary 1 3) 5 0 (wynik pary 5 7) 5 0 (wynik pary 2 4) 5 0 (wynik pary 6 8) 5 0 (wynik pary 1 5) 5 0 (wynik pary 2 3) 5 0 (wynik pary 6 7) 5 0 (wynik pary 4 8) 5 0 (wynik pary 1 6) 5 0 (wynik pary 2 5) 5 0 (wynik pary 3 8) 5 0 (wynik pary 4 7) 5 0 (wynik pary 1 4) 5 0 (wynik pary 2 6) 5 0 (wynik pary 3 7) 5 0 (wynik pary 5 8) Dane wyjściowe 1 5 25 0 2 4 20 5 3 3 15 10 5 3 15 10 4 2 10 15 6 2 10 15 7 1 5 20 8 0 0 25 Agent B Sojusz Strategicznych Sił Reakcyjnych (SSSR) ciągle nie pozwala spać spokojnie agentom Sił Pokojowych. Nowy Plan przejęcia Władzy nad Światem, ukryty w najtajniejszym sejfie, w najtajniejszym schronie najtajniejszejszego budynku, w nieznanym miejscu stolicy Sojuszu nie jest jednak bezpieczny, dopóki agent Dżejms Błąd błąka się po ulicach. Pokonał on wszystkie zabezpieczenia i jest o krok od zdobycia Planu. Niestety, komputer był i jest wrogiem Dżejmsa – a Plan ukryty jest wśród zer i jedynek na twardym dysku Najtajniejszego Komputera SSSR. Ale jak się do niego dostać, jeżeli dostępna jest jedynie klawiatura i ekran? Dżejms już wie co zrobić. Wyciąga telefon satelitarny i wybiera numer... Właśnie dzwoni Twoja komórka. Odbierasz i słyszysz: "My name is Błąd, Dżejms Błąd. Help me, please!" UWAGA: Maszyna wirtualna do zadania do pobrania ze strony RKI Zadania do wykonania UWAGA: - proszę używać poleceń systemowych - system ma prymitywne zabezpieczenia (a nawet błędną konfigurację), więc aby wykonać wszystkie zadania trzeba je odnaleźć i się ich pozbyć - polecenia wykonywać z uprawnieniami użytkownika root 1. Dostać się do systemu (do dyspozycji jest tylko klawiatura, nie ma dostępu do CD-ROMu, USB i innych urządzeń) 2. Znaleźć pliki xxx.cpp i yy.cpp, połączyć ze sobą tworząc plik xxxyy.cpp, gdzie xxx – pierwsze trzy litery miesiąca Twojego urodzenia (małe i bez polskich znaków), yy – końcowe cyfry roku Twojego urodzenia i skopiować do katalogu domowego użytkownika root 3. Pobrać ze strony http://ii.uwb.edu.pl/rkinfor/e2015/dane/ plik o nazwie xxx.test (znaczenie xxx jw.) do katalogu domowego użytkownika root (linki do plików nie są umieszczone na stronie) 4. Porównać ze sobą zawartość plików – różniące się linie przesłać do pliku out.txt w katalogu domowym użytkownika root (jeśli plik nie istnieje, należy go utworzyć) 5. Skompilować plik xxxyy.cpp i uruchomić podając jako parametry xxx i yy – wynik działania dodać do pliku out.txt 6. Zrestartować komputer 7. Uruchomić skrypt o nazwie end z poziomu katalogu domowego użytkownika root 8. Wynikowy plik out.txt jest rozwiązaniem zadania Tajne przez poufne Dzięki Tobie Najtajniejszy Komputer SSSR już działa należycie, można już tworzyć konta użytkowników i dawać im tajne zadania do wykonania. Procedura wygląda tak, że administrator systemu w wybranym przez siebie momencie tworzy w kartotece /tmp plik o nazwie GROUPX jako sygnał informujący użytkowników wybranej grupy, dla których jest to grupa pierwotna, że należy jak najszybciej wziąć się do tajnej roboty. Systemowy numer grupy stanowi zawartość pliku GROUPX a X jest numerem zadania (liczba z przedziału od 1 do 1000). Następnie administrator tworzy w swojej kartotece domowej plik ENDX – ale to jest informacja poufna i o tym nie wiedzą nawet sami użytkownicy. Zadanie użytkowników polega na utworzeniu w znanej tylko sobie lokalizacji w głębi swojej kartoteki domowej (zakładamy, że użytkownicy mają je w kartotece /home a ich nazwy odpowiadają nazwom użytkowników) pliku o nazwie ANSWERX jako odpowiedź na zadanie X. Twoim zadaniem jest napisanie skryptu o nazwie testgroup, który pomoże administratorowi oceniać te zadania. Przede wszystkim, dla każdego z zadań trzeba zbadać, czy wszyscy użytkownicy danej grupy utworzyli plik odpowiedzi na dane zadanie. Jeśli użytkownik nie ma danego rozwiązania, to otrzymuje za to zadanie tyle punktów karnych, ilu jest wszystkich użytkowników w grupie. Jeśli udało mu się utworzyć plik pomiędzy pojawieniem się pliku GROUPX a chwilą kiedy powstał plik ENDX, to liczy się kto zrobił to prędzej. Na tej podstawie administrator sporządza listę rankingową użytkowników w ten sposób, że pierwszy na liście nie dostaje punktów karnych, natomiast wszyscy kolejni odpowiednio po 1, 2, 3 itd. Punkty są sumowane dla wszystkich zadań, które mieli do wykonania użytkownicy. Na koniec należy wypisać nazwy użytkowników wraz z ilością otrzymanych punktów karnych. Dane wejściowe Skrypt powinien być wywoływany z jednym parametrem oznaczającym numer grupy. Testowanie skryptu można prowadzić zakładając grupy i konta użytkowników w systemie uruchomionym na maszynie wirtualnej do pobrania ze strony RKI a następnie tworzenie odpowiednich plików GROUPX, ENDX oraz ANSWERX. Do systemu można się zalogować np. poprzez konto rki z hasłem rki2015, a następnie użyć polecenia sudo, aby uzyskać uprawnienia administratora. Dane wyjściowe Lista linii oznaczających użytkowników danej grupy i sumę otrzymanych przez nich punktów karnych łącznie za wszystkie zadania, w formacie username:points. Wypisujemy użytkowników w rosnącej kolejności punktów karnych, w przypadku tej samej ilości punktów dodajemy sortowanie alfabetyczne po nazwach użytkowników. Przykład: Dane wejściowe (przykładowe uruchomienie skryptu) ./testgroup 1006 Dane wyjściowe (przykładowe wyjście skryptu) haker:1 smartass:4 brainy:7 tiny:14 lamer:19 Żywot nauczyciela Wszyscy wiemy, że nasi belfrowie mają dużo pracy pod koniec roku szkolnego. Postanowiliśmy pomóc trochę naszym nauczycielom i postanowiliśmy zaprojektować im specjalną bazę danych. Nasza baza danych zawiera informacje o uczniach, przedmiotach, nauczycielach i klasach. Oczywiście nie będziemy tworzyć wszystko na ostatnią chwilę, bo nie chcemy dopuścić do sytuacji, jaka miała miejsce na ostatnich wyborach samorządowych. Dlatego postanowiliśmy wprowadzić dane testowe i najpierw sprawdzić jak działa nasza baza danych w wersji beta. Twoim zadaniem będzie przetestowanie naszej bazy danych. Aby tego dokonać, przygotowaliśmy dla Ciebie 5 krótkich zadań: 1. Chcemy sprawdzić, czy uczniowie w naszej bazie mają rodzeństwo w tej samej szkole. Wyświetl ilu uczniów ma na nazwisko Kowalski, nadaj liczbie uczniów alias Kowalscy. 2. Niestety nie mamy informacji o płci uczniów, ale możemy temu zaradzić zakładając, że imiona dziewczyn kończą się na literę „a”. Wyświetl nazwiska uczniów i ich klasy, gdy jego imię kończy się na literę „a”. Wynik posortuj rosnąco według nazwiska. 3. Sprawdźmy teraz jakich przedmiotów uczą nauczyciele. Wyświetl nazwy przedmiotów, które są uczone przez Jana Kowalskiego. Wynik posortuj malejąco według nazwy. 4. Teraz zobaczmy, jakie mamy klasy w naszej szkole. Wyświetl nazwy klas i liczbę uczniów chodzących do danej klasy. Pomiń klasy, do których chodzi mało uczniów, czyli takie, które mają mniej niż czterech uczniów. Kolumnę z liczbą uczniów nazwij „ile”. 5. I nareszcie najważniejsza rzecz dowiemy się, do których przedmiotów uczniowie z całej szkoły przykładają się najbardziej. Wyświetl nazwy przedmiotów i średnią ocen poszczególnych przedmiotów. Kolumnę dotyczącą średniej ocen nazwij „srednia”. Zapytania generujące odpowiedzi na kolejne zadania należy umieścić w pliku tekstowym o nazwie belfer.txt. Zasadzka Bojowy patrol rozpoznawczy prowadząc działania w lesie, znalazł się pod ostrzałem zamaskowanych strzelców wyborowych nieprzyjaciela. Co więcej patrol ten stracił kontakt z pododdziałem macierzystym i nie mógł liczyć na ich wsparcie. Na podstawie analizy w podczerwieni udało się im jednak określić położenie poszczególnych strzelców oraz wyznaczyć dwa najbardziej prawdopodobne kierunki prowadzonego ostrzału przez każdego z nich. Dodatkowo, jak się okazało, występujące w lesie przeszkody naturalne ograniczają zasięg możliwego ostrzału w poszczególnych kierunkach. Niestety, odcinki w których mogliby spodziewać się ostrzału dość dokładnie pokrywały teren lasu i próba ucieczki w dowolnym kierunku (po linii prostej) wiązała się z natknięciem na co najmniej jeden taki odcinek. Dodatkowo patrol ten nie był w stanie przeanalizować samodzielnie wszystkich bardziej skomplikowanych dróg ucieczki, tak aby zminimalizować liczbę przecinanych odcinków, na których mogliby spodziewać się ostrzału. Stwierdził jednak, że nie odnalazł takich punktów, w których krzyżowałoby się więcej niż dwa tego typu odcinki. Pomóż patrolowi i napisz program, który wyznaczy taką najmniejszą liczbę. Dane wejściowe W pierwszym wierszu znajdują się dwie liczby n, m, z których pierwsza określa długość boku kwadratowej mapy (n ≤ 200), rozpiętej przez punkty [0,0],[0,n],[n,0],[n,n] oraz liczbę strzelców nieprzyjaciela (m ≤ 1000). Dalej w drugim wierszu znajdują się dwie liczby całkowite x,y (0<x,y<n) określające położenie patrolu. Następnie w m kolejnych wierszach podane są szóstki liczb całkowitych x, y, x1, y1, x2, y2 (0<x,y,x1,y1,x2,y2<n), gdzie x,y określają położenie strzelca, a x1, y1 oraz x2, y2 określają koniec pierwszego oraz drugiego najbardziej prawdopodobnego odcinka prowadzonego przez tego strzelca ostrzału. Dane wyjściowe Minimalna liczba prawdopodobnych odcinków ostrzału, które należy przeciąć, aby wydostać się poza teren ostrzału (mapy) uwzględniająca trasę dowolnego kształtu . Przykład: Dane wejściowe 11 3 6 4 1 1 10 3 2 6 8 9 10 1 2 3 5 10 7 6 3 6 Dane wyjściowe 0 Ilustracja do przykładu: