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: