Tomasiewicz
A. Jaskka . Jocz R. Kozikowski
Kadra informatyczna:
Ireneusz Bujnowski
Adrian Jaskka
Joachim Jelisiejew
ukasz Jocz
Robert Kozikowski
Jacek Tomasiewicz (koordynator)
Gwni organizatorzy:
Iwona Bujnowska
Ireneusz Bujnowski
Joachim Jelisiejew
Jacek Tomasiewicz
ISBN 978-83-930856-3-7
Niniejsze wydanie ksiki ukazuje si dziki:
inicjatywie i dziaaniom Olimpiady Informatycznej,
rodkom finansowym firmy Google,
wsparciu Orodka Edukacji Informatycznej i Zastosowa Komputerw.
Spis treci
1 Wstp
Grupa pocztkujca
2 Zadania
2.1 Dzie prbny . . . . .
Dodawanie . . . . . .
2.2 Dzie pierwszy . . . .
Koszykarz . . . . . . .
Odchudzanie . . . . .
Wyk . . . . . . . . .
Znak dziaania . . . .
2.3 Dzie drugi . . . . . .
Monety . . . . . . . .
Permutacje . . . . . .
Tama . . . . . . . . .
Pole . . . . . . . . . .
2.4 Dzie trzeci . . . . . .
Wykrelanka . . . . .
Pieczka . . . . . . . .
Bawanek . . . . . . .
Manipulacja rankingu
2.5 Dzie czwarty . . . . .
Pinezki . . . . . . . .
Szachy . . . . . . . . .
Kratki . . . . . . . . .
Patyki . . . . . . . . .
2.6 Dzie pity . . . . . .
Grusze i jabonie . . .
Farby . . . . . . . . .
Siownia . . . . . . . .
Dziewczynki . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
11
11
11
12
12
13
14
15
16
16
17
18
19
20
20
21
22
23
24
24
25
26
27
28
28
29
30
31
3 Rozwizania
3.1 Dzie prbny .
3.2 Dzie pierwszy
3.3 Dzie drugi . .
3.4 Dzie trzeci . .
3.5 Dzie czwarty .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
32
32
33
37
42
46
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
SPIS TRECI
3.6
SPIS TRECI
Dzie pity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4 Wykady
4.1 Zoono czasowa . . . . . . . . . . . . . . . . . .
4.1.1 Wstp . . . . . . . . . . . . . . . . . . . . .
4.1.2 Czym jest zoono . . . . . . . . . . . . .
4.1.3 Przykady rnych zoonoci . . . . . . . .
4.1.4 Czy program ma wystraczajc zoono .
4.1.5 Podsumowanie . . . . . . . . . . . . . . . .
4.2 Praktyczne zastosowanie STL, cz I . . . . . . .
4.2.1 Wstp . . . . . . . . . . . . . . . . . . . . .
4.2.2 Czym jest STL . . . . . . . . . . . . . . . .
4.2.3 Wady STL . . . . . . . . . . . . . . . . . .
4.2.4 Para . . . . . . . . . . . . . . . . . . . . . .
4.2.5 Vector, podstawy . . . . . . . . . . . . . . .
4.2.6 Kolejka . . . . . . . . . . . . . . . . . . . .
4.2.7 Kolejka priorytetowa . . . . . . . . . . . . .
4.2.8 Podstawowe algorytmy i ich wykorzystanie
II
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
50
54
54
54
54
55
57
58
59
59
59
59
60
61
63
64
65
67
5 Zadania
5.1 Dzie prbny .
Kostki domina
5.2 Dzie pierwszy
Sznurki . . . .
Wiea . . . . .
Tablica . . . . .
5.3 Dzie drugi . .
Obwody . . . .
Wiea 2 . . . .
Akwarium . . .
5.4 Dzie trzeci . .
Tarasy . . . . .
Rolki papieru .
Karty . . . . .
5.5 Dzie czwarty .
Las . . . . . . .
Suma . . . . .
5.6 Dzie pity . .
Wykres . . . .
Turniej . . . . .
Przyjcie . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
69
69
69
70
70
71
72
73
73
74
75
76
76
77
78
79
79
81
82
82
83
84
6 Rozwizania
6.1 Dzie prbny .
6.2 Dzie pierwszy
6.3 Dzie drugi . .
6.4 Dzie trzeci . .
6.5 Dzie czwarty .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
85
85
87
90
93
97
SPIS TRECI
6.6
SPIS TRECI
7 Wykady
7.1 Teoria liczb I . . . . . . . . . . . . . . . . . . . . . . .
7.1.1 Wstp . . . . . . . . . . . . . . . . . . . . . . .
7.1.2 Sprawdzenie czy liczba jest pierwsza. . . . . . .
7.1.3 Sito Eratostenesa . . . . . . . . . . . . . . . . .
7.1.4 Wasnoci rozkadu liczby na czynniki pierwsze
7.1.5 Algorytm Euklidesa . . . . . . . . . . . . . . .
7.1.6 Faktoryzacja n! . . . . . . . . . . . . . . . . . .
7.2 Algorytmy rwnolege . . . . . . . . . . . . . . . . . .
7.2.1 Wstp . . . . . . . . . . . . . . . . . . . . . . .
7.2.2 Model oblicze . . . . . . . . . . . . . . . . . .
7.2.3 Typy maszyny PRAM . . . . . . . . . . . . . .
7.2.4 Przykady zada . . . . . . . . . . . . . . . . .
7.2.5 Przeskakiwanie . . . . . . . . . . . . . . . . . .
7.2.6 Jeszcze kilka przykadw . . . . . . . . . . . . .
7.2.7 Zadania . . . . . . . . . . . . . . . . . . . . . .
7.3 Praktyczne zastosowanie STL, cz II . . . . . . . . .
7.3.1 Wstp do wskanikw . . . . . . . . . . . . . .
7.3.2 Iterator . . . . . . . . . . . . . . . . . . . . . .
7.3.3 Algorytmy wykorzystujce iteratory i wskaniki
7.3.4 Lista . . . . . . . . . . . . . . . . . . . . . . . .
7.3.5 Zbir i multizbir . . . . . . . . . . . . . . . . .
7.3.6 Mapa . . . . . . . . . . . . . . . . . . . . . . .
7.3.7 Przeadowanie operatora . . . . . . . . . . . . .
7.3.8 Stabilne sortowanie . . . . . . . . . . . . . . . .
III
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Grupa olimpijska
8 Zadania
8.1 Dzie prbny . . . . . . . . . . .
Pocig . . . . . . . . . . . . . . .
8.2 Dzie pierwszy . . . . . . . . . .
Zegary . . . . . . . . . . . . . . .
Cykl . . . . . . . . . . . . . . . .
mieszny konkurs informatyczny
8.3 Dzie drugi . . . . . . . . . . . .
Najdusze rosnce podcigi . . .
ABC . . . . . . . . . . . . . . . .
Cikie klocki . . . . . . . . . . .
8.4 Dzie trzeci . . . . . . . . . . . .
Guziki . . . . . . . . . . . . . . .
Pokoje . . . . . . . . . . . . . . .
Przyjazne punkty . . . . . . . . .
8.5 Dzie czwarty . . . . . . . . . . .
Dziwna planeta . . . . . . . . . .
Kupiec . . . . . . . . . . . . . . .
Materiay wybuchowe . . . . . .
106
106
106
106
107
108
109
109
111
111
111
111
112
113
114
115
116
116
117
118
119
120
121
121
123
125
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
127
127
127
129
129
130
131
133
133
134
135
136
136
137
138
139
139
140
141
SPIS TRECI
8.6
SPIS TRECI
Dzie pity . . . . . . . . . .
Najduszy, wsplny, rosncy
Bubu . . . . . . . . . . . . . .
Myszka . . . . . . . . . . . .
9 Rozwizania
9.1 Dzie prbny .
9.2 Dzie pierwszy
9.3 Dzie drugi . .
9.4 Dzie trzeci . .
9.5 Dzie czwarty .
9.6 Dzie pity . .
10 Wykady
10.1 Teoria
10.1.1
10.1.2
10.1.3
10.1.4
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
142
142
143
144
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
145
145
147
150
157
162
169
liczb II . . . . . . . . . . . . . . . . . . . . . . . . .
Rozszerzony algorytm Euklidesa . . . . . . . . . .
Rozwizywanie liniowego rwnania diofantycznego
Zliczanie punktw kratowych . . . . . . . . . . . .
Zadanie Trzsienie Ziemi . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
173
173
173
174
175
177
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Rozdzia 1
Wstp
Drogi Czytelniku!
Oddajemy Ci do rk ksik ktra jest zbiorem zada, rozwiza i wykadw z tegorocznego
obozu organizowanego przez I Liceum Oglnoksztacce w Biaymstoku oraz Podlaskie Stowarzyszenie na Rzecz Uzdolnionych. Treci zada z tej ksiki znajduj si rwnie w serwisie
http://main.edu.pl/, na tej stronie mona te sprawdzi poprawno swojego rozwizania w warunkach zblionych do obozowych. Na wstpie chcielibymy podzikowa za nieocenion pomoc
nastpujcym osobom:
Pani mgr Iwonie Bujnowskiej i Panu mgr Ireneuszowi Bujnowskiemu za organizacj obozu
i wszechstronne wsparcie,
Pani Joannie Bujnowskiej za autorstwo czci zada,
Panu prof. dr hab. Krzysztofowi Diksowi za wsparcie merytoryczne,
Panu Adamowi Iwaniukowi za opracowanie czci zada,
Panu Joachimowi Jelisiejewowi za redakcj, korekt, obsug skryptw w LaTeX-u, obsug
sprawdzarki obozowej oraz autorstwo czci zada,
Panu Tadeuszowi Kuranowi za umoliwienie kolejnego wydania tej ksiki.
Pani mgr Annie Opaliskiej, polonistce w I Liceum Oglnoksztaccym, za korekt bdw
jzykowych i stylistycznych,
Panu mgr Jakubowi Radoszewskiemu za udostpnienie serwisu http://main.edu.pl/ i pomocne rady.
Pierwszy obz zosta zorganizowany we wrzeniu 2008 z inicjatywy Ireneusza Bujnowskiego
i Iwony Bujnowskiej. Od pocztku przybra on form tygodniowego wyjazdu, na ktrym uczestnicy rozwizuj zadania matematyczne i informatyczne wzorowane na zadaniach z licealnych
olimpiad przedmiotowych. Tegoroczny obz, organizowany w dniach 19 - 25 wrzenia w orodku
wypoczynkowym PROserwy w Serwach koo Augustowa, zgromadzi ponad stu uczestnikw.
Obz ma profil typowo naukowy rankami uczestnicy mierz si z zadaniami, popoudniu, po
krtkiej przerwie na obiad i zajcia sportowe, przeprowadzane s omwienia zada oraz liczne
wykady. Rozkad dnia jest do napity, czas wolny obozowiczw to jedynie pny wieczr.
Zadania, warsztaty i wykady maj bardzo zrnicowany poziom najatwiejsze dostosowane
7
Cze
I
,
Grupa pocztkujca
Rozdzia 2
Zadania
2.1
Dzie prbny
Zadanie: Dodawanie
Dostpna pami: 32 MB
Dzie 0, 19.09.2010
Dodawanie
ukasz nie umie dodawa. Napisz program, ktry dodaje dwie liczby cakowite a i b.
Wejcie
W pierwszym wierszu standardowego wejcia znajduj si dwie liczb cakowite a, b (1 6
a, b 6 1000).
Wyjcie
W pierwszym i jedynym wierszu wyjcia powinna si znajdowa jedna liczba cakowita, rwna
sumie dwch liczb a i b.
Przykad
dla danych wejciowych:
1 2
poprawnym wynikiem jest:
3
11
2.2
ROZDZIA 2. ZADANIA
Dzie pierwszy
Zadanie: Koszykarz
Dostpna pami: 32 MB
Dzie 1, 20.09.2010
Koszykarz
Kozik pragnie zosta koszykarzem. Po rozmowie z trenerem okazao si, e jest za niski.
Kozik jest jednak tak zdeterminowany, e chce speni wymagania trenera, nawet jeli okazaoby
si to oszustwem. Wpad wic na genialny pomys robienia sobie guzw na gowie, a osignie
wymagany wzrost. Zauway, e przy kadym uderzeniu guz si powiksza o m cm. Kozik
zastanawia si, ile minimalnie razy bdzie musia si uderzy.
Wejcie
W pierwszej linii wejcia znajduj si 3 liczby cakowite: k, w, m (1 6 k 6 200, 1 6 w, m 6
oznaczajce odpowiednio wysoko Kozika, wymagan przez trenera wysoko oraz warto
powikszania si guza po kadym uderzeniu.
109 ),
Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb cakowit rwn minimalnej
liczbie uderze, ktre musi wykona Kozik.
Przykad
dla danych wejciowych:
180 202 10
poprawnym wynikiem jest:
3
12
ROZDZIA 2. ZADANIA
Zadanie: Odchudzanie
Dostpna pami: 32 MB
Dzie 1, 20.09.2010
Odchudzanie
Kozik postanowi si odchudzi. Jest po n dniach diety i intensywnego treningu, jednak
waga nie spadaa mu rwnomiernie, a czasem nawet (ku zdziwieniu Kozika) zwikszaa si.
Kozik codziennie zapisywa swoj wag i teraz chce si pochwali kolegom, wic wybierze
taki fragment swojego dzienniczka, w ktrym schud najbardziej. Znajd ten fragment i policz,
ile w nim schud (czyli oblicz maksymalny spadek wagi Kozika)
Wejcie
W pierwszym wierszu wejcia znajduje si jedna liczba cakowita n (1 6 n 6 106 ). W drugim
wierszu wejcia znajduje si n liczb cakowitych wk oznaczajcych wag Kozika w k - tym dniu
diety (1 6 wk 6 109 ).
Wyjcie
W pierwszym i jedynym wierszu wyjcia powinna znale si jedna liczba cakowita, oznaczajca maksymalny spadek wagi Kozika.
Przykad
dla danych wejciowych:
5
6 7 5 4 2
poprawnym wynikiem jest:
5
13
ROZDZIA 2. ZADANIA
Zadanie: Wyk
Dostpna pami: 32 MB
Dzie 1, 20.09.2010
Wyk
Ulubion zabaw Stasia jest gra w wyka. Polega ona na tym, e najpierw wybiera sobie
jedn liczb cakowit n, a nastpnie zaczyna na kartce zapisywa kolejne liczby naturalne.
Chopiec zapisuje cznie n wierszy, w kadym z nich po n liczb.
W pierwszym wierszu Sta wypisuje liczby od 1 do n od lewej do prawej. Drugi wiersz
wypenia jednak od prawej do lewej liczbami od n + 1 do 2n. I tak dalej: wiersze o numerach
nieparzystych wypenia od lewej do prawej, a te o numerach parzystych od prawej do lewej.
Twoim zadaniem jest napisanie programu, ktry bdzie automatycznie gra w wyka.
Wejcie
W pierwszym i jedynym wierszu wejcia znajduje si jedna liczba naturalna n (1 6 n 6 100).
Wyjcie
Na wyjcie naley wypisa n wierszy, w kadym z nich po n liczb naturalnych. Razem ma
zosta wypisanych n2 liczb: wszystkie liczby naturalne od 1 do n2 . W kadym wierszu wypisane
liczby powinny by pooddzielane pojedynczymi odstpami.
Przykad
dla danych wejciowych:
6
poprawnym wynikiem jest:
1 2 3
12 11
13 14
24 23
25 26
36 35
4 5 6
10 9 8 7
15 16 17
22 21 20
27 28 29
34 33 32
18
19
30
31
14
ROZDZIA 2. ZADANIA
Dostpna pami: 32 MB
Dzie 1, 20.09.2010
Znak dziaania
Napisz program, ktry wczyta dwie liczby cakowite a i b, a nastpnie wstawi znak dziaania
+, - albo * midzy nimi, w taki sposb, aby wynik dziaania by jak najwikszy. Jeeli
mona uzyska najwikszy wynik za pomoc wicej ni jednego dziaania, wypisujemy sowo
NIE.
Wejcie
W pierwszym i jedynym wierszu wejcia znajduj si dwie liczby cakowite a i b (104 6
a, b 6 104 ).
Wyjcie
W pierwszym i jedynym wierszu wyjcia zapis dziaania zgodnie z przykadem lub sowo
NIE (wszystkie liczby ujemne naley zapisywa w nawiasie).
Przykad
dla danych wejciowych:
6 -5
poprawnym wynikiem jest:
6-(-5)=11
15
2.3
ROZDZIA 2. ZADANIA
Dzie drugi
Zadanie: Monety
Dostpna pami: 32 MB
Dzie 2, 21.09.2010
Monety
Bajtek posiada n monet. Kada z monet jest o nominale 1 Bajtalara i posiada dwie strony:
awers i rewers. Bajtek ma rozoone monety na stole i zastanawia si ile minimalnie monet
musi przewrci na druga stron, aby wszystkie monety leay na awersie lub wszystkie leay
na rewersie.
Wejcie
Pierwszy wiersz wejcia zawiera jedn liczb cakowit n (1 6 n 6 106 ), oznaczajca liczb
monet Bajtka. Kolejny wiersz zawiera cig n liczb cakowitych a1 , a2 , ..., an , gdzie ai oznacza
opis i-tej monety, 0 jeli moneta ley na awersie, 1 jeli moneta ley na rewersie.
Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb cakowit rwn minimalnej
liczbie monet, jakie Bajtek powinien obrci na drug stron.
Przykad
dla danych wejciowych:
6
1 0 1 1 1 0
poprawnym wynikiem jest:
2
16
ROZDZIA 2. ZADANIA
Zadanie: Permutacje
Dostpna pami: 32 MB
Dzie 2, 21.09.2010
Permutacje
Bajtek napisa na kartce n liczb. Zastanawia si teraz, czy s one permutacj liczb od 1 do
n, czyli czy kada z liczb 1, 2, 3..., n 1, n, wystpuje dokadnie jeden raz w tym cigu.
Wejcie
Pierwszy wiersz standardowego wejcia zawiera jedn liczb cakowit n (1 6 n 6 106 ),
oznaczajc ilo liczb jakie wypisa Bajtek. Kolejny wiersz zawiera cig n liczb cakowitych
a1 , a2 , ...an (1 6 ai 6 109 ), gdzie ai oznacza i-t liczb w cigu Bajtka.
Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera sowo TAK, jeli cig Bajtka jest permutacj liczb od 1 do n, lub sowo NIE, jeli cig Bajtka nie jest permutacj liczb od 1 do n.
Przykad
dla danych wejciowych:
5
1 4 3 2 5
poprawnym wynikiem jest:
TAK
17
ROZDZIA 2. ZADANIA
Zadanie: Tama
Dostpna pami: 32 MB
Dzie 2, 21.09.2010
Tama
Ja znalaz w domu dug tam. Bez chwili namysu napisa na tamie pewien cig liczb
cakowitych. Teraz chciaby przeci tam w pewnym miejscu tak, aby rnica pomidzy sum
liczb na jednym kawaku a sum liczb na drugim kawaku bya jak najblisza zeru. Chcielibymy
zna warto bezwzgldn z owej rnicy.
Wejcie
Pierwszy wiersz wejcia zawiera jedn liczb cakowit n (2 6 n 6 106 ), oznaczajc ilo
liczb wypisanych na tamie. Drugi wiersz zawiera n liczb cakowitych ai (103 6 ai 6 103 ),
oznaczajcych kolejne liczby wypisane na tamie.
Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb cakowit rwn minimalnej
wartoci bezwzgldnej rnicy pomidzy dwoma kawakami.
Przykad
dla danych wejciowych:
6
1 2 3 4 5 6
poprawnym wynikiem jest:
1
18
ROZDZIA 2. ZADANIA
Zadanie: Pole
Dostpna pami: 32 MB
Dzie 2, 21.09.2010
Pole
Napisz program, ktry majc dane wsprzdne dwch prostoktw, ktrych boki s rwnolege do osi wsprzdnych, policzy pole czci wsplnej tych prostoktw.
Wejcie
W pierwszym wierszu wejcia znajduj si 4 liczby cakowite: x1 , y1 , x2 , y2 , oznaczajce
odpowiednio wsprzdn x ow i y ow lewego grnego rogu i wsprzdn x ow i y
ow prawego dolnego rogu pierwszego prostokta.
W drugim wierszu wejcia znajduj si 4 liczby cakowite: x3 , y3 , x4 , y4 , oznaczajce odpowiednio wsprzdn x ow i y ow lewego grnego rogu i wsprzdn x ow i y ow
prawego dolnego rogu drugiego prostokta.
Wszystkie wsprzdne s nie mniejsze ni 0 i nie wiksze ni 1000000.
Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn licz cakowit rwn wartoci
pola czci wsplnej dwch prostoktw.
Przykad
dla danych wejciowych:
0 3 4 0
2 4 6 1
poprawnym wynikiem jest:
4
19
2.4
ROZDZIA 2. ZADANIA
Dzie trzeci
Zadanie: Wykrelanka
Dostpna pami: 32 MB
Dzie 3, 22.09.2010
Wykrelanka
Jasio wypisa cig n liczb cakowitych. Cigiem dobrym nazwiemy cig kolejnych liczb naturalnych 1, 2, 3, ... itd. Jasio chciaby wykreli jak najmniej liczb w taki sposb, aby pozostae
liczby utworzyy dobry cig. Jeli Jasio nie moe utworzy adnego dobrego cigu, to powinien
wykreli wszystkie liczby.
Wejcie
Pierwszy wiersz wejcia zawiera jedn liczb cakowit n (1 6 n 6 106 ), oznaczajca ilo
liczb w cigu Jasia. Kolejny wiersz zawiera cig n liczb cakowitych a1 , a2 , ..., an (1 6 ai 6 109 ),
oznaczajcych kolejne wartoci liczb w cigu Jasia.
Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb cakowit rwn minimalnej
iloci liczb, ktre powinien wykreli Ja.
Przykad
dla danych wejciowych:
7
2 1 3 2 5 3 4
poprawnym wynikiem jest:
3
20
ROZDZIA 2. ZADANIA
Zadanie: Pieczka
Dostpna pami: 32 MB
Dzie 3, 22.09.2010
Pieczka
Asia dostaa na urodziny magiczn pieczk. Pieczka ta, spadajc z pewnej wysokoci,
odbija si na wysoko dwa razy wiksz. Asia zrzucia pieczk z balkonu z pewnej wysokoci
x. Zastanawia si teraz, po ilu odbiciach pieczka znajdzie si na wysokoci w.
Wejcie
W pierwszej linii wejcia znajduje si jedna liczba cakowita z (1 6 z 6 106 ), oznaczajca
liczb zestaww danych. Dla kadego zestawu danych w nowym wierszu znajduj si dwie liczby
cakowite x i w (1 6 x 6 109 , 0 6 w 6 109 ).
Wyjcie
Dla kadego zestawu danych w z kolejnych wierszach powinna znale si jedna liczba cakowita rwna liczbie odbi, po ktrych pieczka znajdzie si na wysokoci w.
Przykad
dla danych wejciowych:
2
3 4
2 6
poprawnym wynikiem jest:
1
2
21
ROZDZIA 2. ZADANIA
Zadanie: Bawanek
Dostpna pami: 32 MB
Dzie 3, 22.09.2010
Bawanek
Pewnej mronej zimy Kasia i Asia pojechay do parku. Jak to w zimie, park jest peen
niegu, a dokadniej znajduje si w nim x litrw niegu. Gdy Asia rozmawiaa przez telefon,
Kasia postanowia ulepi bawana. Zanim Asia skoczya rozmawia Kasia ulepia ju jedn
kul z k litrw niegu.
Asia chce, aby bawan by zbudowany z 3 kul niegowych i dodatkowo kula leca na innej
kuli musi by 2 razy mniejsza. Asia nie moe ju powiksza ani pomniejsza kuli zrobionej
przez Kasi i musi j wykorzysta, gdy Kasia mogaby si pogniewa.
Dziewczynki chc zbudowa jak najwikszego bawana. Teraz zastanawiaj si, z ilu mililitrw niegu moe by zbudowany ich bawan.
Wejcie
W pierwszym wierszu wejcia znajduj si dwie liczby cakowite x, k (1 6 x 6 106 , 1 6
k 6 105 , k < x), oznaczajce odpowiednio ilo litrw niegu w parku oraz z ilu litrw niegu
zbudowana jest jedna z kul nienych bawana.
Wyjcie
W pierwszym i jedynym wierszu wyjcia powinna znajdowa si jedna liczb cakowita, rwna
maksymalnej objtoci bawana (wynik podaj w mililitrach).
Przykad
dla danych wejciowych:
10 2
poprawnym wynikiem jest:
7000
22
ROZDZIA 2. ZADANIA
Dostpna pami: 32 MB
Dzie 3, 22.09.2010
Manipulacja rankingu
Dymwka wama si do obozowej sprawdzarki i moe teraz manipulowa rankingiem. Konkretniej mwic, moe on ustawi wag kadego zadania. Sumaryczna liczba punktw jest
obliczana jako:
X
Zadania na obozie s oceniane binarnie: rozwizanie otrzymuje 0 lub 100 punktw. Waga
zadania moe by ustawiona na dowoln liczb cakowit z przedziau [0, 2000]. Dymwka
niestety nie umie wyliczy, na ile opaca mu si zmiana wag. Pom mu w tym.
Wejcie
W pierwszym wierszu wejcia znajduj si dwie liczby cakowite n, m (1 6 n, m 6 1000),
oznaczajce odpowiednio liczb uczestnikw obozu oraz liczb zada na obozie. W nastpnych
n linijkach wyniki kolejnych uczestnikw: w kadej linijce m liczb (kada rwna 0 lub 100), oznaczajce wyniki uczestnika w kolejnych zadaniach. Wynik Dymwki jest podany jako pierwszy.
Wyjcie
W jedynej linijce wypisz dwie liczby: pierwsza oznaczajca najlepsz pozycj w rankingu,
jak moe zdoby manipulacj Dymwka, oraz druga, oznaczajca minimaln liczb osb, z ktrymi bdzie on ex aequo na tej najlepszej pozycji. Pozycje w rankingu liczone s od 1.
Przykad
dla danych wejciowych:
3 1
100
0
0
poprawnym wynikiem jest:
1 1
23
2.5
ROZDZIA 2. ZADANIA
Dzie czwarty
Zadanie: Pinezki
Dostpna pami: 32 MB
Dzie 4, 23.09.2010
Pinezki
Ja wraca do domu, jednak na mocie kto rozoy w linii prostej pinezki. Most jest tak
wski, e nie mona przej obok pinezki trzeba przeskoczy. Pinezki nie s rozoone wszystkie
obok siebie, czasami znajduj si miejsca, na ktrych mona stan.
Most zoony jest z n desek i na kadej z nich moe znajdowa si pinezka. Na deskach bez
pinezek Ja moe stawa, a na tych z pinezkami ju nie. Chcielibymy wiedzie, jak duy skok
musi posiada Ja, aby mg przej na drug stron mostu. Dugo skoku to liczb desek, ktre
moe przeskoczy Ja.
Wejcie
W pierwszej linii wejcia znajduje si jedna liczba cakowita n (1 6 n 6 106 ), oznaczajca
liczb desek, z ktrych zbudowany jest most. W kolejnym wierszu znajduje si n liczb cakowitych a1 , a2 , ..., an , gdzie ai oznacza opis i-tej deski: 0 jeli na desce nie ma pinezki, 1 jeli na
desce jest pinezka.
Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb cakowit rwn dugoci
skoku Jasia, jaki musi posiada, aby przedosta si na drug stron mostu.
Przykad
dla danych wejciowych:
7
0 1 0 1 1 1 1
poprawnym wynikiem jest:
4
24
ROZDZIA 2. ZADANIA
Zadanie: Szachy
Dostpna pami: 32 MB
Dzie 4, 23.09.2010
Szachy
Tatu maego Paweka jest znanym na wiecie arcymistrzem szachowym i bardzo chciaby,
eby jego synek pody jego ladami. Dlatego zacz go ju uczy gra w szachy, mimo modego
wieku chopca. Niestety Pawekowi kiepsko idzie nauka, najwyraniej nie ma do tego smykaki.
Przez pierwsze 3 dni uczy si ruchw pionka, nastpne 8 ruchw skoczka, a teraz uczy si
ruchw wiey, z ktr radzi sobie duo lepiej i szacuje si, e po drugim dniu opanuje w peni jej
moliwoci. W kadym razie po pierwszym dniu Paweek umie ju porusza si ni w poziomie.
Chopiec jeszcze nie wie, jaka lekcja go czeka nastpnego dnia, wic jest wicie przekonany,
e wie mona przesun na dowolne pole w tym samym wierszu i na adne inne.
Paweek wymyli wasn zabaw narysowa szachownic (niekoniecznie o wymiarach 8x8,
ale kwadratow) i powypisywa na jej polach rne liczby, po jednej na kadym polu. Nastpnie
zacz stawia na polach wiee tak, aby suma liczb na polach zajtych przez nie bya moliwie jak
najwiksza. Chopiec moe postawi dowoln liczb wie. Gdy nie postawi ani jednej, przyjmuje
si, e suma jest rwna O. eby zabawa nie bya zbyt prosta, trzyma si reguy, e adne dwie
wiee nie mog sta na jednym polu, ani wzajemnie siebie atakowa (wedug jego aktualnego
stanu wiedzy o szachach).
Majc dan wielko szachownicy oraz liczby jakie Paweek powpisywa w pola szachownicy,
podaj jak najwiksz sum moe uzyska, stawiajc wiee zgodnie z podanymi reguami.
Wejcie
W pierwszym wierszu wejcia znajduje si jedna liczba cakowita n (1 6 n 6 200), mwica
jaka jest wysoko i szeroko szachownicy. W kolejnych n wierszach opisu przedstawiona jest
zawarto pl w kolejnych wierszach szachownicy. Tak wic w wierszu i-tym (spord tych n)
znajduje si n liczb cakowitych (z przedziau od 1000000 do 1000000), bdcych wartociami
zapisanymi w kolejnych polach i-tego wiersza szachownicy.
Wyjcie
Naley wypisa jedn liczb cakowit maksymaln sum, jak chopiec moe uzyska.
Przykad
dla danych wejciowych:
3
1 2 3
1 2 3
1 2 3
poprawnym wynikiem jest:
9
25
ROZDZIA 2. ZADANIA
Zadanie: Kratki
Dostpna pami: 32 MB
Dzie 4, 23.09.2010
Kratki
Ja ma wiele czystych biaych kartek papieru. Kartki maj rne wielkoci. Ja postanowi
przerobi pewn bia kartk na kartk w kratk czyli chciaby dorysowa pewn liczb pionowych kresek i pewn liczb poziomych kresek (rwnolegych do bokw kartki), ktre podziel
kartk na mae prostokty.
Ja musi jednak zachowa odstp d milimetrw pomidzy kolejnymi liniami, za odlego
linii od dowolnego boku musi wynosi co najmniej 1 milimetr. Ja chciaby wybra tak kartk,
ktr bdzie mg podzieli na jak najwiksz liczb prostoktw (prostokty utworzone pomidzy pierwsz lini a bokiem kartki rwnie liczymy). Ze wszystkich kartek, ktre bdzie mg
podzieli na tak sam liczb prostoktw, chciaby wybra kartk o najwikszej powierzchni.
Znajd t powierzchni.
Wejcie
Pierwszy wiersz wejcia zawiera dwie liczby cakowite n, d (1 6 n 6 106 , 1 6 d 6 100), oznaczajce odpowiednio liczb biaych kartek Jasia oraz minimalny odstp pomidzy liniami. Nastpnych n wierszy zawiera opisy kolejnych kartek papieru. Kady z wierszy skada si z dwch
liczb cakowitych ai , bi (2 6 ai , bi 6 104 ), oznaczajcych odpowiednio dugo i szeroko i-tej
kartki.
Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb oznaczajc powierzchni
kartki, ktr powinien wybra Ja.
Przykad
dla danych wejciowych:
2 2
2 5
3 6
poprawnym wynikiem jest:
18
26
ROZDZIA 2. ZADANIA
Zadanie: Patyki
Dostpna pami: 32 MB
Dzie 4, 23.09.2010
Patyki
Bajtu znalaz w lesie 3 patyki. Teraz chciaby wiedzie, czy moe z nich zbudowa trjkt
prostoktny lub rwnoboczny. Bajtu nie moe ama patykw, moe je wykorzysta tylko
w caoci.
Wejcie
Pierwszy wiersz wejcia zawiera trzy liczby cakowite a, b, c (1 6 a, b, c 6 1000), oznaczajce
odpowiednio dugo pierwszego, drugiego i trzeciego patyka.
Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb: 0 jeli Bajtu nie moe
zbudowa ani trjkta prostoktnego, ani rwnobocznego, 1 jeli Bajtu moe zbudowa tylko
trjkt prostoktny, 2 jeli Bajtu moe zbudowa tylko trjkt rwnoboczny.
Przykad
dla danych wejciowych:
3 4 5
poprawnym wynikiem jest:
1
27
2.6
ROZDZIA 2. ZADANIA
Dzie pity
Dostpna pami: 32 MB
Dzie 5, 24.09.2010
Grusze i jabonie
W pewnym sadzie rosn grusze i jabonie, wszystkie w linii prostej, oddalone co 1 metr
od siebie. Waciciel sadu, Pan Wiktor, chciaby znale grusz najbardziej oddalon od jaboni.
Pom mu znale te drzewa i podaj odlego pomidzy nimi.
Wejcie
Pierwszy wiersz wejcia zawiera jedn liczb cakowit n (2 6 n 6 106 ), oznaczajc liczb
drzew w sadzie. Kolejny wiersz zawiera cig n liczb cakowitych a1 , a2 , ...an , gdzie ai oznacza
rodzaj i-tego drzewa: 0 oznacza grusz, 1 oznacza jabo. Mona zaoy, e w sadzie ronie
co najmniej jedna grusza i co najmniej jedna jabo.
Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb cakowit, rwn maksymalnej odlegoci pomidzy grusz a jaboni.
Przykad
dla danych wejciowych:
5
0 1 1 0 0
poprawnym wynikiem jest:
3
28
ROZDZIA 2. ZADANIA
Zadanie: Farby
Dostpna pami: 32 MB
Dzie 5, 24.09.2010
Farby
W ILO zaczy si generalne porzdki. Pani dyrektor postanowia, e pan konserwator Jarek
powinien odwiey sale na parterze i pomalowa je na jej ulubione kolory.
Na parterze mamy 6 rnych sal. Pani dyrektor chciaaby, aby pierwsza sala zostaa pomalowana na to, druga na zielono, trzecia na niebiesko, czwarta na fioletowo, pita na czerwono,
a ostatnia na pomaraczowo.
Pan Jarek przypomnia sobie, e ze starych zapasw posiada pewn ilo farby czerwonej,
tej oraz niebieskiej. Ku zadowoleniu pani dyrektor stwierdzi, e trzy kolory wystarcz mu na
spenienie proby dyrekcji, poniewa ze szkoy podstawowej pamita, e aby otrzyma kolor zielony, wystarczy zmiesza w tych samych ilociach farb t z niebiesk, analogicznie fioletowa
powstanie z farby niebieskiej i czerwonej, a pomaraczowa z farby tej oraz czerwonej.
Pan Jarek chciaby wiedzie, ile farby kadego rodzaju (czerwonej, tej i niebieskiej) musi
dokupi, aby mc wymalowa wszystkie sale.
Wejcie
W pierwszym wierszu podane s trzy liczby cakowite dodatnie c , z oraz n pooddzielane
pojedynczymi spacjami: ilo farby czerwonej (0 < c 6 109 ), ilo farby tej (0 < z 6 109 ),
oraz ilo farby niebieskiej (0 < n 6 109 ), ktr posiada Pan Jarek. W kolejnych 6 wierszach
podane s liczby cakowite dodatnie 0 < pi 6 1000, wyraajce ilo litrw farby potrzebnych
na wymalowanie poszczeglnych sal.
Wyjcie
Twj program powinien wypisa trzy liczby, oznaczajce odpowiednio ilo farby czerwonej,
tej, oraz niebieskiej, ktr trzeba dokupi, aby mc wymalowa wszystkie sale.
Przykad
dla danych wejciowych:
20 10 8
10
4
5
3
3
8
poprawnym wynikiem jest:
0 6 0.5
29
ROZDZIA 2. ZADANIA
Zadanie: Siownia
Dostpna pami: 32 MB
Dzie 5, 24.09.2010
Siownia
Adrian stwierdzi, e ma wt klat i okrgy brzuszek. Z tego powodu postanowi powiczy klat. Wyznaczy sobie, e do koca roku uda mu si wycisn n, (1 6 n 6 109 )
mikrogramw. Adrian pracuje w dwch rnych browarach, w ktrych produkowane s piwa
(oczywicie bezalkoholowe). W jednym produkowane s piwa o wadze a mikrogramw, a w drugim piwa o wadze b mikrogramw, (1 6 a, b 6 n). Adrian postanowi wyciska piwa na klat.
Adrian zaczyna od najmniejszego moliwego ciaru i idzie stopniowo w gr, idc zawsze do
pierwszego wikszego ciaru. Zastanawia si teraz, ile rnych ciarw uda mu si wycisn
zanim osignie ciar maksymalny. Adrian nie moe przenosi piw z jednego browaru do drugiego. W kadym browarze wystarczy mu piw na osignicie celu.
Wejcie
W pierwszej i jedynej linii wejcia znajduj si trzy liczby cakowite: a, b, n, bdce odpowiednio wag piw w pierwszym browarze, wag piw w drugim browarze oraz ciaru docelowego
Adriana.
Wyjcie
W pierwszej linii wyjcia powinna znale si jedna liczba cakowita, bdca liczb rnych
ciarw, ktre wycinie Adrian.
Przykad
dla danych wejciowych:
5 7 15
poprawnym wynikiem jest:
5
30
ROZDZIA 2. ZADANIA
Zadanie: Dziewczynki
Dostpna pami: 32 MB
Dzie 5, 24.09.2010
Dziewczynki
Chopcy i dziewczynki ustawili si w szereg, osoba tu obok osoby. Zastanawiamy si teraz,
ilu minimalnie chopcw musi usun si z szeregu, aby pod rzd stao k dziewczynek, jedna tu
obok drugiej i pomidzy nimi wszystkimi nie sta aden chopiec.
Wejcie
Pierwszy wiersz standardowego wejcia zawiera dwie liczby cakowite n, k (1 6 k 6 n 6
106 ), oznaczajce odpowiednio liczb osb ustawionych w szeregu oraz liczb dziewczynek, jakie
chcemy, aby stay pod rzd . Kolejny wiersz wejcia zawiera n liczb cakowitych 0 lub 1,
oznaczajcych kolejne osoby ustawione w szeregu: 0 oznacza dziewczynk, 1 chopca.
Wyjcie
Pierwszy i jedyny wiersz standardowego wyjcia powinien zawiera jedn liczb cakowit,
oznaczajc minimaln liczb chopcw, ktrzy powinni usun si z szeregu, lub jedno sowo
NIE, gdy nie da si usun chopcw tak, aby k dziewczynek stao pod rzd.
Przykad
dla danych wejciowych:
8 3
0 1 1 0 1 0 1 0
poprawnym wynikiem jest:
2
31
Rozdzia 3
Rozwizania
3.1
Dzie prbny
Opracowanie: Dodawanie
Dostpna pami: 32 MB
Dzie 0, 19.09.2010
Dodawanie
Rozwizanie wzorcowe
Trikiem byo w tym zadaniu uycie operatora dodawania, ktre dawao rozwizanie o zoonoci O(1). Trzeba byo by ostronym, aby nie uy 8-bitowych liczb cakowitych, gdy wtedy
rozwizanie padao dla duych wartoci a i b.
32
ROZDZIA 3. ROZWIZANIA
3.2
Dzie pierwszy
Opracowanie: Koszykarz
Dostpna pami: 32 MB
Dzie 1, 20.09.2010
Koszykarz
Rozwizanie wzorcowe
Na pocztku obliczmy, ile Kozik musi urosn, odejmujc od wymaganego wzrostu wzrost
Kozika. Jeli warto ta nie jest dodatnia, to Kozik nie musi ani razu uderza si w gow.
W przeciwnym wypadku wystarczy podzieli warto, jak Kozik musi jeszcze urosn, przez
warto, o jak ronie guz Kozika z kadym uderzeniem (naley pamita, e jeli reszta z dzielenia nie wynosi zero, to naley do wyniku doda 1).
1
2
3
4
5
w c z y t a j ( k , w, m)
i f w > k then
wypisz ( (w k + m 1 ) / m)
else
wypisz ( 0 )
33
ROZDZIA 3. ROZWIZANIA
Opracowanie: Odchudzanie
Dostpna pami: 32 MB
Dzie 1, 20.09.2010
Odchudzanie
Rozwizanie wolne
Najprostszym rozwizaniem jest sprawdzenie kadej pary fragmentu, w ktrej Kozik moe
rozpocz i zakoczy swj trening.
1
2
3
4
5
6
7
wczytaj (n , t [ ] )
wynik := 0
f o r i := 1 to n do
f o r j := i to n do
i f t [ j ] t [ i ] > wynik then
wynik := t [ j ] t [ i ]
wypisz ( wynik )
Takie rozwizanie jest niestety zbyt wolne, gdy dziaa w zoonoci czasowej O(n2 ). Zoono
pamiciowa wynosi O(n).
Rozwizanie wzorcowe
Zauwamy, e dla kadego moliwego koca fragmentu najlepszym pocztkiem bdzie maksymalna waga Kozika, ktra wystpowaa od pocztku treningu do aktualnego dnia (wtedy spadek
wagi bdzie wanie najwikszy). Tak maksymaln wag moemy atwo oblicza, aktualizujc
nasze maksimum z kadym nowym dniem.
1
2
3
4
5
6
7
8
9
maksimum := 0
wynik := 0
f o r k := 1 to n do
wczytaj ( x )
i f x > maksimum then
maksimum := x
i f maksimum x > wynik then
wynik := maksimum x
wypisz ( wynik )
Rozwizanie bdne
Rozwizanie, ktre znajduje maksimum i minimum w caym cigu i liczy ich rnice, jest
bdne. Prosty przykad: Kozik pierwszego dnia way 1, a drugiego 10 maksymalny spadek
Kozika powinien wynosi 0.
34
ROZDZIA 3. ROZWIZANIA
Opracowanie: Wyk
Dostpna pami: 32 MB
Dzie 1, 20.09.2010
Wyk
Najprostsze najlepsze
Zauwamy, e zawsze musimy wypisa n wierszy, a wic najprociej bdzie zaprojektowa
jedn ptl, ktra wykonuje n przej, w ktrych co robi, oraz wypisuje znak nowej linii.
Teraz zastanwmy si, co ma si wykonywa wewntrz tej ptli. Musimy wypisa n liczb
oddzielonych spacjami, a wic najlepiej zrobi to za pomoc ptli, ktra wykona n przej
i wypisze po jednej liczbie. Zauwamy, e cig liczb jest albo cigiem rosncych liczb o jeden lub
malejcych o jeden, a wic aby wypisa odpowiednie liczby, potrzebujemy wiedzie dwie rzeczy:
1. Jaka jest liczba startowa?
2. Czy jest to cig rosncy czy malejcy?
Drugi punkt atwo moemy rozwiza sprawdzajc, czy numer wiersza (tzn. licznik naszej
gwnej ptli) jest liczb parzyst.
Natomiast co do pierwszego punktu moemy wykona proste obserwacje. Rozbijmy to take
na dwa przypadki: wiersze parzyste i nieparzyste. Niech x bdzie numerem wiersza (numerowanie rozpoczynamy od 1).
atwo wymyli wzr na pierwsz liczb w wierszach nieparzystych:
1 -> 1
3 -> 2 * n + 1
x -> (x - 1) * n + 1
natomiast dla wierszy parzystych:
2 -> 2 * n
4 -> 4 * n
x -> x * n
A wic w zalenoci, czy wiersz jest parzysty, czy nieparzysty (wystarczy sprawdzi reszt
z dzielenia przez 2 na liczniku gwnej ptli) wypiszemy cig rosncy bd malejcy n liczb,
zaczynajc od liczby wyliczonej z wzorw, ktre znalelimy powyej.
1
2
3
4
5
6
7
8
9
10
11
12
13
wczytaj (n)
f o r i := 1 to n do
i f i mod 2 == 1 then
w := ( i 1 ) n + 1
f o r j := 1 to n do
wypisz (w)
w := w + 1
else
w := i n
f o r j := 1 to n do
wypisz (w)
w := w 1
wypisz ( n o w a l i n i a )
35
ROZDZIA 3. ROZWIZANIA
Dostpna pami: 32 MB
Dzie 1, 20.09.2010
Znak dziaania
Rozwizanie wzorcowe
W zadaniu naley obliczy warto maksymaln z trzech wartoci: a + b, a b, a b oraz
sprawdzi, czy wynik da si uzyska wicej ni jednym sposobem. Moemy to zrobi na wiele
sposobw. W naszym opracowaniu najpierw policzymy maksymaln warto, a nastpnie sprawdzimy iloma sposobami moemy j osign.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
wczytaj (a , b)
maksimum := a + b
znak := +
i f a b > maksimum then
znak :=
maksimum := a b
i f a b > maksimum then
znak :=
maksimum := a b
sposoby := 0
i f a + b == maksimum then sposoby := sposoby + 1
i f a b == maksimum then sposoby := sposoby + 1
i f a b == maksimum then sposoby := sposoby + 1
i f sposoby > 1 then
wypisz ( NIE )
else
i f a < 0 then wypisz ( ( a ) ) e l s e wypisz ( a )
wypisz ( znak )
i f b < 0 then wypisz ( ( b ) ) e l s e wypisz ( b )
wypisz ( = )
i f maksimum < 0 then wypisz ( ( maksimum ) ) e l s e wypisz ( maksimum )
36
ROZDZIA 3. ROZWIZANIA
3.3
Dzie drugi
Opracowanie: Monety
Dostpna pami: 32 MB
Dzie 2, 21.09.2010
Monety
Najprostsze najlepsze
Rozwizanie zadania jest stosunkowo proste. Naley policzy liczb monet lecych na jednej
stronie i liczb monet lecych na drugiej stronie, a nastpnie wybra minimum z tych wartoci.
1
2
3
4
5
6
7
8
9
10
wczytaj (n)
awers := 0
r e w e r s := 0
f o r k := 1 to n do
wczytaj ( x )
i f x == 0 then
awers := awers + 1
else
r e w e r s := r e w e r s + 1
wypisz ( min ( awers , r e w e r s ) )
37
ROZDZIA 3. ROZWIZANIA
Opracowanie: Permutacje
Dostpna pami: 32 MB
Dzie 2, 21.09.2010
Permutacje
Rozwizanie wolne
Najprostszym rozwizaniem jest sprawdzanie kolejnych liczb 1, 2, ...n 1, n czy wystpuj
we wczytanym cigu.
1
2
3
4
5
6
7
8
9
10
wczytaj (n , t [ ] )
f o r i := 1 to n do
z n a l a z l e m := f a l s e
f o r k := 1 to n do
i f t [ k ] == i then
z n a l a z l e m := true
i f z n a l a z l e m == f a l s e then
wypisz ( NIE )
zakoncz program ( )
wypisz (TAK)
Powysze rozwizanie jest zdecydowanie za wolne zoono czasowa wynosi O(n2 ), a pamiciowa O(n).
Rozwizanie wzorcowe
Stwrzmy tablic n elementow i kad liczb wmy do odpowiedniej komrki. Na koniec
przejdmy po caej tablicy sprawdzajc, czy w kadej komrce jest liczba. Naley uwaa,
e jeli liczba jest wiksza od wielkoci tablicy to nic z ni nie robimy (aby nie odwoywa si
do nieistniejcej komrki w tablicy).
1
2
3
4
5
6
7
8
9
10
11
wczytaj (n)
tab [ ] := 0
f o r k := 1 to n do
wczytaj ( x )
i f x <= n then
tab [ x ] := 1
f o r k := 1 to n do
i f tab [ k ] == 0 then
wypisz ( NIE )
zakoncz program ( )
wypisz (TAK)
38
ROZDZIA 3. ROZWIZANIA
Opracowanie: Tama
Dostpna pami: 32 MB
Dzie 2, 21.09.2010
Tama
Rozwizanie brutalne
Najprostszym rozwizaniem wydaje si dla kadego miejsca na tamie sprawdzi, ile wynosi
szukana warto. Wic dla kadej liczby, z wyjtkiem ostatniej, sprawdzamy, ile wynosi suma
liczb do tej liczby z ni wcznie, oraz suma liczb za t liczb (nie robimy tego dla ostatniej liczby,
poniewa odpowiadaoby to sytuacji takiej, gdy wykonujemy cicie na samym kocu tamy, co nie
sprawi, e podzielimy j na dwa kawaki). Nastpnie wyliczamy warto bezwzgldn z rnicy
tych sum i poprawiamy wynik.
1
2
3
4
5
6
7
8
9
10
11
w c z y t a j ( n , tab [ ] )
wynik := 1000000000
f o r i := 1 to n1 do
sumal := sumap := 0
f o r j := 1 to i do
sumal := sumal + tab [ i ]
f o r j := i + 1 to n do
sumap := sumap + tab [ i ]
w a r t o s c := abs ( sumal sumap )
wynik := min ( wartosc , wynik )
wypisz ( wynik )
Niestety przy takim podejciu przy milionie liczb program bdzie wykonywa si bardzo dugo,
poniewa dla kadego miejsca cicia (106 takich miejsc) bdziemy liczy sum 106 liczb, co da nam
w sumie 106 106 = 1012 operacji.
Rozwizanie wzorcowe
Zauwamy, e majc sum wszystkich liczb (mona to policzy zaraz po ich wczytaniu do tablicy) oraz znajc sum liczb po lewej stronie, moemy policzy sum liczb po stronie prawej,
odejmujc sum liczb z lewej strony od cakowitej sumy. Jeli mamy policzon sum liczb z lewej strony i chcemy wykona cicie o jedn liczb dalej, to suma liczb bdzie rni si jedynie
wartoci rwn tej liczbie, ktr przeskakujemy.
1
2
3
4
5
6
7
8
9
10
11
w c z y t a j ( n , tab [ ] )
sumac := sumal := 0
f o r i := 1 to n do
sumac := sumac + tab [ i ]
wynik := 1000000000
f o r i := 1 to n1 do
sumal := sumal + tab [ i ]
sumap := sumac sumal
w a r t o s c := abs ( sumal sumap )
wynik := min ( wartosc , wynik )
wypisz ( wynik )
ROZDZIA 3. ROZWIZANIA
Opracowanie: Pole
Dostpna pami: 32 MB
Dzie 2, 21.09.2010
Pole
Jeden wymiar
Zastanwmy si, jak rozwiza zadanie, w ktrym musielibymy znale cz wspln dwch
odcinkw. Moemy wyrni 3 przypadki:
[A]
[B]
[C]
b1
a1
a2
b2
b1
a1
b2
a2
a1
b1
a2
b2
function p o l i c z p r z e c i e c i e ( a1 , b1 , a2 , b2 )
begin
p o c z a t e k = max( a1 , a2 )
k o n i e c = min ( b1 , b2 )
r e t u r n max ( 0 , k o n i e c p o c z a t e k )
end
40
ROZDZIA 3. ROZWIZANIA
Dwa wymiary
Przejdmy do rozwizania zadania, czyli znalezienia czci wsplnej dwch prostoktw.
x1, y1
x3, y3
x2, y2
x4, y4
Przykadowe uoenie dwch prostoktw.
Aby obliczy dugoci bokw prostokta, bdcego czci wspln, wystarczy znale czci wsplne odpowiednich odcinkw danych prostoktw. Pierwszy bok obliczymy liczc cz
wspln bokw prostoktw ograniczonych wsplrzdnymi x owymi, a drugi liczc cz
wspln bokw ograniczonych wsprzdnymi y owymi.
Pseudokod mgby wyglda nastpujco:
1
2
3
d l u g o s c 1 = p o l i c z p r z e c i e c i e ( x1 , x2 , x3 , x4 )
d l u g o s c 2 = p o l i c z p r z e c i e c i e ( y4 , y3 , y2 , y1 )
wypisz ( d l u g o s c 1 d l u g o s c 2 )
41
3.4
ROZDZIA 3. ROZWIZANIA
Dzie trzeci
Opracowanie: Wykrelanka
Dostpna pami: 32 MB
Dzie 3, 22.09.2010
Wykrelanka
Rozwizanie wzorcowe
Ja chce stworzy jak najduszy cig liczb 1, 2, 3, ... W tym celu musi znale pierwsz
jedynk wystpujc w cigu nawet jeli wystpuj inne jedynki, to najbardziej opaca si
wzi najwczeniejsz, gdy wzicie innej zmniejsza nam przedzia szukania kolejnej liczby. Nastpnie szukamy pierwszej dwjki wystpujcej za pierwsz jedynk, potem trjki wystpujcej
za dwjk itd.
1
2
3
4
5
6
7
wczytaj (n)
szukany := 1
f o r k := 1 to n do
wczytaj ( x )
i f x == szukany then
szukany := szukany + 1
wypisz ( n szukany + 1 )
42
ROZDZIA 3. ROZWIZANIA
Opracowanie: Pieczka
Dostpna pami: 32 MB
Dzie 3, 22.09.2010
Pieczka
Rozwizanie wzorcowe
Zauwamy, e pieczka bardzo szybko zwiksza wysoko, do ktrej dolatuje z kadym
odbiciem, wysoko zwiksza si dwukrotnie, wic nawet jeli pieczka zostaaby zrzucona z najniszej wysokoci 1, to ju po 30 odbiciach doleciaaby do wysokoci ponad 109 . Naley zwrci
uwag, e pieczka zrzucona z wikszej wysokoci ni wysoko, do ktrej chcemy, aby doleciaa,
nie musi wykonywa adnego odbicia.
1
2
3
4
5
6
7
8
wczytaj ( z )
f o r k := 1 to z do
w c z y t a j ( x , w)
o d b i c i a := 0
while ( x < w) do
x := x 2
o d b i c i a := o d b i c i a + 1
wypisz ( o d b i c i a )
43
ROZDZIA 3. ROZWIZANIA
Opracowanie: Bawanek
Dostpna pami: 32 MB
Dzie 3, 22.09.2010
Bawanek
Rozwizanie wzorcowe
W rozwizaniu naley rozway 4 przypadki:
1. Jeli kula, ktr zbudowaa Kasia jest najmniejsza w bawanie naley sprawdzi czy z pozostaej iloci niegu mona zbudowa 2 wiksze kule
2. Jeli kula, ktr zbudowaa Kasia jest rednia w bawanie
3. Jeli kula, ktr zbudowaa Kasia, jest najwiksza w bawanie
4. Jeli kula, ktr zbudowaa Kasia, jest za dua, aby z pozostaej iloci niegu wybudowa
2 mniejsze kule.
1
2
3
4
5
wczytaj (x , k )
i f x >= 7 k then wypisz ( 7 0 0 0 k )
e l s e i f 2 x >= 7 k then wypisz ( 3 5 0 0 k )
e l s e i f 4 x >= 7 k then wypisz ( 1 7 5 0 k )
e l s e wypisz ( 0 )
44
ROZDZIA 3. ROZWIZANIA
Dostpna pami: 32 MB
Dzie 3, 22.09.2010
Manipulacja rankingu
Rozwizanie wzorcowe
Powiemy, e zawodnik A jest obiektywnie lepszy od Dymwki, jeeli A zrobi wszystkie
zadania, ktre zrobi Dymwka. Zauwamy, e przy pomocy manipulacji Dymwka nie moe
wyprzedzi w rankingu zawodnika obiektywnie lepszego.
Stwierdzamy, e zawsze istnieje manipulacja, dziki ktrej Dymwka ostro wyprzedza w rankingu wszystkich zawodnikw, ktrzy nie s obiektywnie lepsi od niego i jest ex aequo ze wszystkimi obiektywnie lepszymi (na 1 pozycji). Taka manipulacja jest optymalna z punktu widzenia
Dymwki.
Manipulacja polega na ustawieniu wag 1 wszystkim zadaniom, ktre Dymwka rozwiza,
oraz wag 0 wszystkim zadaniom, ktrych nie rozwiza. Pozostawiamy czytelnikowi weryfikacj,
e ta manipulacja faktycznie spenia zaoenia (wane jest tutaj, e s tylko 2 moliwe oceny
za zadanie).
Zatem wystarczy policzy, ile jest zawodnikw obiektywnie lepszych od Dymwki. Moemy
to bez trudu zrobi liniowo wzgldem iloci danych wejciowych:
1
2
3
4
5
6
7
8
9
10
11
w c z y t a j ( n , m, wynik dymowki [ ] )
i l e l e p s z y c h := 1
f o r i := 2 to n do
l e p s z y := true
f o r j := 1 to m do
w c z y t a j ( wynik )
i f wynik != 100 and wynik dymowki [ j ] == 100 then
l e p s z y := f a l s e
i f l e p s z y == true then
i l e l e p s z y c h := i l e l e p s z y c h + 1
wypisz ( 1 , i l e l e p s z y c h )
45
3.5
ROZDZIA 3. ROZWIZANIA
Dzie czwarty
Opracowanie: Pinezki
Dostpna pami: 32 MB
Dzie 4, 23.09.2010
Pinezki
Rozwizanie wzorcowe
Rozwizaniem zadania bdzie maksymalna liczba pinezek lecych obok siebie. Z kad
kolejno napotkan pinezk zwikszamy sum o jeden, natomiast przy napotkaniu pustej deski
zerujemy nasz sum.
1
2
3
4
5
6
7
8
9
10
11
wczytaj (n)
suma := 0
wynik := 0
f o r k := 1 to n do
wczytaj ( pinezka )
i f p i n e z k a == 1 then
suma := suma + 1
else
suma := 0
wynik := max( wynik , suma )
wypisz ( wynik )
46
ROZDZIA 3. ROZWIZANIA
Opracowanie: Szachy
Dostpna pami: 32 MB
Dzie 4, 23.09.2010
Szachy
Rozwizanie wzorcowe
Na pocztku zauwamy, e nie zawsze opaca si stawia wie w kadym wierszu szachownicy. Opaca nam si to tylko w przypadku, gdy wszystkie liczby w danym wierszu s nieujemne.
Tak wic naszym rozwizaniem bdzie znalezienie w kadym wierszu maksimum z wartoci
{0, w1 , ...wn }, gdzie wi oznacza liczb stojc w i-tej kolumnie rozpatrywanego wiersza.
1
2
3
4
5
6
7
8
9
wczytaj (n)
wynik := 0
f o r w i e r s z := 1 to n do
akt := 0
f o r kolumna := 1 to n do
wczytaj ( x )
akt := max( akt , x )
wynik := wynik + akt
wypisz ( wynik )
47
ROZDZIA 3. ROZWIZANIA
Opracowanie: Kratki
Dostpna pami: 32 MB
Dzie 4, 23.09.2010
Kratki
Rozwizanie bdne
Popularnym bdem moe by wypisanie maksymalnej powierzchni kartki. Nie jest prawd,
e kartk o maksymalnej powierzchni da si podzieli na najwiksz liczb prostoktw.
Rozwizanie wzorcowe
Maksymalna liczba prostoktw, na jakie mona podzieli kartk, wynosi (2 + (a 2)/d)
(2+(b2)/d), gdzie znak / jest wziciem czci cakowitej z dzielenia bez reszty. Pierwsz lini
rysujemy w odlegoci 1 milimetra od brzegu, a kad nastpn (tyle ile si zmieci) rysujemy co d
milimetrw. Dla kadej kartki naley obliczy liczb prostoktw na jakie moemy j podzieli
i wybra maksimum.
1
2
3
4
5
6
7
8
9
10
11
wczytaj (n , d)
maksimum := 0
f o r k := 1 to n do
wczytaj (a , b)
l i c z b a k r a t e k := ( 2 + ( a 2 ) / d ) ( 2 + ( a 2 ) / d )
i f l i c z b a k r a t e k == maksimum then
p o w i e r z c h n i a := max( p o w i e r z c h n i a , a b )
i f l i c z b a k r a t e k > maksimum then
maksimum := l i c z b a k r a t e k
p o w i e r z c h n i a := a b
wypisz ( p o w i e r z c h n i a )
48
ROZDZIA 3. ROZWIZANIA
Opracowanie: Patyki
Dostpna pami: 32 MB
Dzie 4, 23.09.2010
Patyki
Rozwizanie wzorcowe
Zadanie naley rozwiza rozwaajc kilka przypadkw. Aby mona byo zbudowa trjkt
prostoktny, to dugo najduszego boku podniesiona do kwadratu musi by rwna sumie
kwadratw dugoci bokw krtszych. Aby trjkt by rwnoboczny to wszystkie patyki musz
by rwnej dugoci.
1
2
3
4
5
6
7
wczytaj (a , b , c )
i f ( a == b ) and ( b == c ) then
wypisz ( 2 ) e l s e
i f ( aa == bb + c c ) or ( bb == a a + c c ) or ( c c == a a + bb ) then
wypisz ( 1 )
else
wypisz ( 0 )
49
3.6
ROZDZIA 3. ROZWIZANIA
Dzie pity
Dostpna pami: 32 MB
Dzie 5, 24.09.2010
Grusze i jabonie
Rozwizanie wolne
Najprostszym rozwizaniem zadania jest sprawdzenie kadej pary drzewek i wybranie maksymalnej odlegoci pomidzy rnymi drzewkami.
1
2
3
4
5
6
7
wynik := 0
w c z y t a j ( n , drzewko [ ] )
f o r k := 1 to n 1 do
f o r i := k + 1 to n do
i f drzewko [ k ] <> drzewko [ i ] then
wynik := max( wynik , i k )
wypisz ( wynik )
Powysze rozwizanie dziaa niestety zbyt wolno zoono czasowa wynosi O(n2 ).
Rozwizanie wzorcowe
Najbardziej oddalonymi drzewkami bdzie pierwsza (wystpujca w cigu) grusza z ostatni
jaboni lub pierwsza jabo z ostatni grusz. Gdyby tak nie byo, to moglibymy wzi
odpowiednio wczeniejsze (pniejsze) drzewko i mielibymy wiksz odlego pomidzy nimi.
Drzewka te moemy znale w czasie liniowym, std zoono czasowa rozwizania wynosi O(n).
1
2
3
4
5
6
7
8
9
10
11
12
wczytaj (n)
p i e g r u s z a := 0
p i e j a b l o n := 0
o s t g r u s z a := 0
o s t j a b l o n := 0
f o r k := 1 to n do
w c z y t a j ( drzewko )
i f drzewko == 0 and p i e g r u s z a == 0 then p i e g r u s z a := k
i f drzewko == 1 and p i e j a b l o n == 0 then p i e j a b l o n := k
i f drzewko == 0 then o s t g r u s z a := k
i f drzewko == 1 then o s t j a b l o n := k
wypisz (max( o s t g r u s z a p i e j a b l o n , o s t j a b l o n p i e g r u s z a ) )
50
ROZDZIA 3. ROZWIZANIA
Opracowanie: Farby
Dostpna pami: 32 MB
Dzie 5, 24.09.2010
Farby
Rozwizanie
W rozwizaniu najpierw wczytujemy obecn ilo farby: c, z oraz n, a nastpnie wczytujemy ilo farby wymagan na pokolorowanie kadej sali i odejmujemy t ilo od objtoci
odpowiedniej puszki.
Aby uatwi sobie obliczenia i mc operowa tylko na liczbach cakowitych, dobrym pomysem jest prowadzi obliczenia na liczbach dwa razy wikszych i dopiero przy wypisywaniu dzieli
wynik przez dwa.
Naley pamita, e jeli w ktrej puszce bdzie nieujemna ilo farby, wtedy nie musimy
niczego dokupi. W przeciwnym wypadku musimy dokupi warto bezwzgldn z iloci farby
w puszce.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
51
Opracowanie: Siownia
ROZDZIA 3. ROZWIZANIA
Dostpna pami: 32 MB
Dzie 5, 24.09.2010
Siownia
Rozwizanie brutalne
Niech bxc to cz cakowita z liczby x, a to wielko piw w pierwszym browarze, b to wielko
piw w drugim browarze, a n to docelowy ciar.
W rozwizaniu brutalnym tworzymy tablic t wielkoci n zapenion samymi 0. Nastpnie
odznaczamy w tablicy wielokrotnoci a na 1 oraz wielokrotnoci b na 1. Na koniec liczymy sum
w tablicy t.
1
2
3
4
5
6
7
8
9
wczytaj (a , b , n)
t [ ] := {0}
f o r i := 1 to n/ a do
t [ a i ] := 1
f o r i := 1 to n/b do
t [ b i ] := 1
f o r i := 1 to n do
wynik := wynik + t [ i ]
wypisz ( wynik )
Powysze rozwizanie dziaa w czasie O(n), a jego zoono pamiciowa to O(n). Dla maksymalnych danych, czyli n = 109 program zdecydowanie przekroczy limit czasu oraz dostpny
limit pamici.
Rozwizanie wzorcowe
Zauwamy, e w pierwszym browarze Adrian moe wycisn na rnych
ciarw, bd
to odpowiednio a, 2a, .... W drugim browarze Adrian moe wycisn nb rnych ciarw,
odpowiednio b, 2b, ....
Zastanwmy si teraz, ile jest takich ciarw, e Adrian moe je wycisn w obu siowniach.
Sprbujmy znale najmniejszy taki ciar. Bdzie to najmniejsza liczba podzielna przez a i b,
czyli nww(a, b). Zauwamy, e wszystkie kolejne powtrzenia bd
nww(a, b).
j wielokrotnociami
k
n
Zatem wszystkich takich ciarw mniejszych rwnych n bdzie nww(a,b) , a wszystkich rnych
j n k
ciarw wyciskanych przez Adriana bdzie na + nb nww(a,b)
, gdy liczc sum na + nb
dwukrotnie policzymy te ciary, ktre Adrian moe wycisn w dwch browarach. nww(a, b) =
ab
nwd(a,b) , a nwd(a, b) moemy atwo policzy korzystajc z algorytmu Euklidesa (opis algorytmu
mona znale w wykadzie Teoria Liczb I)
1
2
3
wczytaj (a , b , n)
wynik := n/ a + n/b + n / ( ab/nwd( a , b ) )
wypisz ( wynik )
ROZDZIA 3. ROZWIZANIA
Opracowanie: Dziewczynki
Dostpna pami: 32 MB
Dzie 5, 24.09.2010
Dziewczynki
Rozwizanie wzorcowe
Zadania rozwizujemy wykorzystujc sposb gsienicy. W dwch zmiennych trzymamy
odpowiednio gow gsienicy i jej ty. Niech koniec bdzie jej tyem, a pocztek jej gow. Pocztkowo obie zmienne ustawiamy na pierwszej osobie w szeregu. Nastpnie pocztek przesuwamy
tak dugo w prawo, dopki pomidzy pocztkiem a kocem nie bdzie dokadnie k dziewczynek.
Nastpnie koniec przesuwamy o jedno miejsce w prawo i ponownie pocztek przesuwamy, dopki
nie bdzie k dziewczynek. Przypomina wic to ruch gsienicy.
Przed kadym przesuniciem koca musimy obliczy liczb chopcw, ktrzy musz usun
si z szeregu i wybra z tych wartoci minimum. Liczb chopcw moemy w prosty sposb
policzy liczc rnic: poczatek koniec+1k, gdy wiemy, e pomidzy pocztkiem a kocem
znajduje si dokadnie k dziewczynek, wic reszt musz stanowi chopcy.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
wczytaj (n , k , t [ ] )
p o c z a t e k := 1
k o n i e c := 1
wynik := n + 1
i f t [ 1 ] == 0 then
d z i e w c z y n k i := 1
else
d z i e w c z y n k i := 0
while k o n i e c < n do
while d z i e w c z y n k i < k and p o c z a t e k < n do
p o c z a t e k := p o c z a t e k + 1
i f t [ p o c z a t e k ] == 0 then d z i e w c z y n k i := d z i e w c z y n k i + 1
i f d z i e w c z y n k i == k then wynik := min ( wynik , p o c z a t e k k o n i e c + 1 )
i f t [ k o n i e c ] == 0 then d z i e w c z y n k i := d z i e w c z y n k i 1
k o n i e c := k o n i e c + 1
i f wynik == n + 1 then
wypisz ( NIE )
else
wypisz ( wynik k )
53
Rozdzia 4
Wykady
4.1
Zoono czasowa
4.1.1
Wstp
Zoono czasowa to jeden z najwaniejszych parametrw charakteryzujcych algorytm. Decyduje on o efektywnoci caego programu.
4.1.2
Zoono czasowa programu jest to maksymalna liczba operacji, jakie moe wykona program
w zalenoci od wczytanych danych.
Badajc zoono zawsze wybieramy operacj dominujc czyli tak, ktra bdzie wykonywa si najwicej razy w zalenoci od wczytanej wartoci n.
Spjrzmy na przykad:
1
2
3
4
5
wynik := 0
c i n >> n
f o r i := 1 to n do
wynik := wynik + i
c o u t << n
wynik := wynik + i
Zauwamy, e wykona si ona n razy. I ju mamy policzon zoono czasow. Wynosi ona
O(n) i nazywamy j liniow zoonoci.
Jeli linijka 3. wygldaaby nastpujco:
1
f o r i := 1 to 20n do
to liczba operacji wynosi 20n, jednak wszystkie stae pomijamy i zoono pozostaje liniowa.
Powiemy wic, e algorytm, ktry wykonuje kn operacji, gdzie k jest sta (np. 21 , 20, 100)
i algorytm ktry wykonuje n operacji, maj tak sam zoono czasow.
54
ROZDZIA 4. WYKADY
Tak wic, analizujc program bdziemy bada, jaka jest najwiksza liczba operacji, ktre
moe on wykona przy okrelonym rozmiarze danych. Czsto bdziemy wyszukiwa specjalne,
zoliwe przykady danych, na ktrych dany program bdzie dziaa dugo. Czemu tak naley
robi? Po pierwsze, dziki temu wiemy, e program bdzie dziaa nie wolniej ni ..., a jak si
skoczy szybciej, to tylko niespodzianka na plus. Po drugie za, okazuje si, e pesymistyczne
ograniczenie bardzo czsto jest osigane na przykad wikszo algorytmw wyszukiwania
elementu w zbiorze dziaa najduej, gdy szukanego elementu nie ma, co jest w praktyce bardzo
czste.
4.1.3
Zoono staa
1
2
c i n >> n
c o u t << n n
Program wykona zawsze sta liczb operacji, niezalenie od wartoci n. Zoono jest wic
staa i zapisujemy j jako O(1).
Zoono logarytmiczna
1
2
3
4
5
6
c i n >> n
wynik := 0
while ( n > 1 ) do
n := n / 2
wynik := wynik + 1
c o u t << wynik
W linijce 4. warto n jest w kadym obrocie ptli zmniejszana o poow. Liczb takich operacji
oblicza si uywajc logarytmw. Jeli n = 2x to log n = x. atwo wic zauway, e zoono
tego rozwizania wynosi bdzie O(log n). Nazywa bdziemy j zoonoci logarytmiczn.
Zoono liniowa
1
2
3
4
5
c i n >> n
f o r i := 1 to n do
c i n >> x
i f x = 0 then
break
c i n >> n
f o r i := 1 to n do
c i n >> p
while ( p < n )
p := p 2
c o u t << p
{p > 0}
55
ROZDZIA 4. WYKADY
Znw znajdmy zoliwy przypadek. Bdzie on wtedy, gdy p = 1. Wwczas w kadym obrocie
ptli z linijki 2. instrukcja w linijce 5. wykonywa si bdzie log n razy. Std caa zoono
wynosi O(n log n) i nazywamy j zoonoci liniowo-logarytmiczn.
Zoono kwadratowa
1
2
3
4
5
6
7
suma i := suma j := 0
c i n >> n
f o r i := 1 to n do
f o r j := i to n do
suma i := suma i + i
suma j := suma j + j
c o u t << suma i + suma j
Zauwamy, e operacja w linijce 5. bdzie wykonywana nie rzadziej ni operacja w kadej innej
linijce. Policzmy liczb wykona tej operacji.
Ptla w linijce 4. bdzie si wykonywaa n, n 1, ... 1 razy. Po zsumowaniu liczba operacji
wynosi bdzie n(n+1)
= 12 (n2 + n) 6 n2 , wic zoono to O(n2 ) i nazywamy j kwadratow.
2
Zoono wykadnicza
1
2
3
4
5
6
7
c i n >> n
p := 1
f o r i := 1 to n
p := p 2
f o r i := 1 to p
wynik := wynik + i
c o u t << wynik
Ile operacji wykona powyszy kod. Ptla w linijce 3. obrci si n razy, jednak ptla w linijce 6.
obrci si p = 2n razy. Wybieramy operacj dominujc, wic zoono wynosi bdzie O(2n ),
ktra nazywana jest zoonoci wykadnicz. Zoonociami wykadniczymi s rwnie O(3n ),
O(10n ), a take O(n!).
Wiele zmiennych
Nie zawsze zoono musi zalee od jednej zmiennej:
1
2
3
4
5
c i n >> n >> m
f o r i := 1 to n do
c o u t << i
f o r j := 1 to m do
c o u t << j
Zauwamy, e czas dziaania programu zaley od obu wartoci n i m, w zwizku z tym zoono
wynosi O(n + m). Mwimy, e zoono jest liniowa wzgldem n i m.
56
ROZDZIA 4. WYKADY
c i n >> n >> m
i f n > m then
f o r i := 1 to n do
c o u t << i
else
f o r j := 1 to m do
c o u t << j
Zoono zaley od wartoci wikszej z liczb n i m. Wynosi wic ona O(max(n, m)).
I jeszcze jeden:
1
2
3
4
5
6
7
c i n >> n
c i n >> m
wynik := 0
f o r i := 1 to n do
f o r j := 1 to m do
wynik := wynik + i j
c o u t << wynik
4.1.4
Podczas pisania programu zawsze warto zastanowi si, czy istnieje rozwizanie o lepszej zoonoci czasowej. Chyba e limity wyranie wskazuj, e wymylone rozwizanie, cho moe
nieoptymalne, zostanie w peni zaakceptowane.
Porwnajmy 3 programy obliczajce dokadnie to samo:
Program A
1
2
3
4
5
c i n >> n
f o r i := 1 to n do
f o r j := 1 to i do
wynik := wynik + 1
c o u t << wynik
Zoono: O(n2 )
Program B
1
2
3
4
c i n >> n
f o r i := 1 to n do
wynik := wynik + i
c o u t << wynik
Zoono: O(n)
57
ROZDZIA 4. WYKADY
Program C
1
2
3
c i n >> n
wynik := n ( n + 1 ) / 2
c o u t << wynik
Zoono: O(1)
Chcielibymy stwierdzi, ktry program bdzie akceptowalny w czasie zawodw. Obecnie mona
przyj, e aby program by akceptowalny w peni przez sprawdzark, to moe wykonywa okoo
108 operacji tyle operacji jest wykonywane przez mniej wicej 1 sekund.
Jeli mamy zadeklarowane, e 1 6 n 6 104 , to wszystkie programy A, B, C powinny zosta
zaakceptowane.
Jeli 1 6 n 6 106 , to program A wykona okoo 1012 operacji, co niestety wywoa przekroczenie limitu czasu. Natomiast program B i C powinien zosta zaakceptowany.
Jeli 1 6 n 6 1010 , to tylko program C moe zosta zaakceptowany.
Warto zwrci uwag, e wczytywanie i wypisywanie danych jest szczeglnie wolne. Wczytanie lub wypisanie wicej ni 106 liczb moe wykonywa si ponad 1 sekund (w zadaniach raczej
nie zdarza si, aby potrzebne byo wczytanie istotnie wielu liczb)
4.1.5
Podsumowanie
1. Jeli n 6 106 , to prbujmy pisa programy o maksymalnej zoonoci O(n) lub O(n log n).
2. Jeli n 6 104 , to prbujmy pisa programy o maksymalnej zoonoci O(n2 )
3. Jeli n 6 500, to prbujmy pisa programy o maksymalnej zoonoci O(n3 )
Oczywicie nie s to cise limity, cho z pewnoci przyblione. Czsto zale one od konkretnego zadania. Na pewno jeli stwierdzimy, e program wykonuje duo ponad 108 operacji
to powinnimy si zastanowi, czy nie istnieje szybsze rozwizanie naszego problemu.
58
ROZDZIA 4. WYKADY
4.2
4.2.1
Wstp
Wykad jest celowany do Czytelnika z bardzo podstawow wiedz o C++. W czci I omwione
s najbardziej podstawowe i najprostsze algorytmy i struktury. Wykad w zaoeniu jest bardziej praktyczny ni teoretyczny. Staramy si uywa niefachowego sownictwa, aby by bardziej
zrozumiay dla osb z podstawow wiedz, czasem celowo pomijamy szczegy, gdy uwaamy,
e do praktycznych zastosowa nie s one konieczne. W czci II s omwione bardziej zaawansowane struktury, ale obie czci s stworzone w celu pokazania STL-a Czytelnikowi, ktry
wczeniej go nie zna.
4.2.2
STL to skrt od Standard Template Library, czyli po polsku Standardowa Biblioteka Szablonw.
STL to zbir bibliotek w C++, w ktrych s szablony rnych algorytmw i struktur danych,
ktre dziaaj niezalenie od tego, jaki typ zawieraj. Za pomoc STL-a moemy wyszukiwa binarnie, sortowa elementy w tablicy, tworzy kolejki priorytetowe w jednej linii tekstu.
Dokumentacja STL jest na stronie:
http://www.sgi.com/tech/stl/
Szukajc dodatkowych informacji lub przypominajc materia z wykadu dobrze jest korzysta
w pierwszej kolejnoci z dokumentacji STL-a, gdy jego kopia znajduje si na kadym komputerze podczas zawodw Olimpiady Informatycznej (i na wielu innych konkursach), a ten skrypt
Czytelnik posiada tylko w domu.
4.2.3
Wady STL
Mimo wielu praktycznych zastosowa i duej uytecznoci, STL posiada szereg wad:
1. Niektre rzeczy dziaaj wolniej w STL ni zaimplementowane samemu (np. stos albo generowanie wszystkich permutacji.
2. Posiadajc gotowe, zaimplementowane niektre struktury czasem, zamiast pomyle chwil
nad szybszym rozwizaniem, uywamy niepotrzebnie STL-a. Czsto, gdy rozwizanie
wzorcowe jest liniowe, to rozwizanie z czynnikiem log n wykorzystujce STL-a, moe
dosta nawet o 1/3 punktw mniej.
3. Bdy w wykorzystaniu STL-a czsto trudno si debuguje, gdy informacje o bdach
w STL-u s zazwyczaj skomplikowane i nie zawsze wynika z nich wprost, gdzie ley bd.
59
4.2.4
ROZDZIA 4. WYKADY
Para
pair < T 1, T 2 > to, jak nazwa wskazuje, para dwch elementw typw T1, T2, ktre mog by
dowolnymi typami, w szczeglnoci nawet kolejn par. Pary czsto wykorzystuje si w geometrii
obliczeniowej jako reprezentacj punktu lub w grafie waonym jako pojedyncza krawd.
Uycie
pair<int,int> p = make_pair(2,3);
p.first;
p.second;
// utworzenie pary
// pierwszy element pary
// drugi element pary
Uwagi
Jeli typy si nie zgadzaj, to program si nie skompiluje, przykad:
pair<int,int> p = make_pair(2,make_pair(2,3)); // le!
Kompilator prbowa zrobi z obiektu pair < int, int > obiekt typu int, czego nie potrafi,
wic si nie skompilowa.
Uwaga co do deklarowania typw zoonych:
Nie moemy da dwch znakw << lub >> bez spacji obok siebie, przykad:
pair<int,pair<int,int>> p1; // le!
pair<int,pair<int,int> >p2; // dobrze
Przykad programu
Przypumy, e chcemy w pewien sposb porwna dwa pairy ze sob. Oczywicie moemy
porwna najpierw pierwszy element paira, a pniej drugi, ale pair dostarcza prostszych sposobw:
1
2
3
4
5
6
p a i r <int , int> p = m a k e p a i r ( 2 , 3 ) ;
p a i r <int , int> q = m a k e p a i r ( 2 , 4 ) ;
p a i r <int , int> r = m a k e p a i r ( 2 , 3 ) ;
p a i r <int , int> s = m a k e p a i r ( 3 , 3 ) ;
i f ( p==r && r<q && q<s )
c o u t << d a j kamienia << e n d l ;
Nastpujcy kod wypisze na ekran daj kamienia, zatem moglimy porwna pairy ze sob.
Dziaa to w nastpujcy sposb:
p == q jest rwnowane z p.f irst == q.f irst&&p.second == q.second
p < q jest rwnowane z (p.f irst < q.f irst)||(p.f irst == q.f irst&&p.second < q.second)
60
ROZDZIA 4. WYKADY
4.2.5
Vector, podstawy
vector < T > w korzystaniu bardzo przypomina standardow tablic. T moe by dowolnym
typem, nawet kolejnym vektorem (wykorzystuje si to czsto w implementacji grafw, gdzie dla
kadego wierzchoka mamy wektor krawdzi). Gwn rnic jest to, e vector < T > moe
zmienia swoj wielko podczas dziaania programu.
Uycie
Podstawowe operacje na vectorach:
#include <vector>
vector<int> V;
V.push_back(x);
V.pop_back();
V[0];
V.size();
//
//
//
//
//
//
//
//
//
//
jest
jest
jest
jest
rwnowane
rwnowane
rwnowane
rwnowane
z
z
z
z
(V.size()==0)
V.resize(0)
V[V.size()-1]
V[0]
Funkcja tworzy kopi vectora, wic jakakolwiek zmiana vectora nie zajdzie na vectorze przekazanym do funkcji.
Jeli chcemy w jaki sposb zmienia vector, to musimy przed nazw doda znak & (przekaza
przez referencj).
1
61
ROZDZIA 4. WYKADY
Przykad programu
Wemy teraz kawaek kodu, ktry zawiera wszystko, o czym mwilimy:
1 #include <i o s t r e a m >
2 #include <v e c t o r >
3 using namespace s t d ;
4
5 void wypisz ( v e c t o r <int> V) {
6
f o r ( int i =0; i <V. s i z e ( ) ; i ++)
7
c o u t << V[ i ] << ;
8
c o u t << e n d l ;
9 }
10 void zmien ( v e c t o r <int>& V) {
11
f o r ( int i =0; i <V. s i z e ( ) ; i ++)
12
V[ i ]++;
13 }
14 int main ( ) {
15
v e c t o r <int> V;
16
V. r e s i z e ( 5 , 1 ) ;
17
wypisz (V ) ;
18
zmien (V ) ;
19
wypisz (V ) ;
20
V. push back ( 5 ) ;
21
wypisz (V ) ;
22
V. pop back ( ) ;
23
wypisz (V ) ;
24
return 0 ;
25 }
1
2
2
2
1
2
2
2
1
2
2
2
1
2
2 5
2
62
ROZDZIA 4. WYKADY
4.2.6
Kolejka
queue < T > to STL-owa implementacja kolejki. W kolejce moemy dokada elementy na koniec i bra z pocztku w czasie staym, czyli, innymi sowy, niezalenie od wielkoci kolejki
dodanie na koniec/zabranie z pocztku trwa tyle samo.
Uycie
Podstawowe operacje na kolejce:
#include <queue>
queue<int> Q;
Q.push(x);
Q.front();
if(Q.empty()) {...}
Q.pop();
//
//
//
//
//
//
63
4.2.7
ROZDZIA 4. WYKADY
Kolejka priorytetowa
priority queue < T > to STL-owa implementacja kopca, czyli struktury, w ktrej moemy
dodawa elementy do kopca w czasie O(log n), zabiera elementy z kopca w czasie O(log n)
i uzyskiwa aktualnie maksymalny element kopca w O(1).
Podstawowe zastosowanie jest prawie identyczne jak zastosowanie kolejki.
Uycie
Podstawowe operacje na kolejce priorytetowej:
#include <queue>
// umoliwia uywanie kolejki priorytetowej
priority_queue<int> Q; // deklaracja kolejki priorytetowej
Q.top();
// uzyskujemy maksymalny element
Q.push(x);
// dodajemy do kolejki element x
Q.pop();
// zabieramy najwikszy element z kolejki
if(Q.empty())
// sprawdzamy czy kolejka jest pusta
Jeli chcemy, aby na szczycie kolejki byy elementy minimalne, musimy zadeklarowa kolejk
w nastpujcy sposb (zamiast int moemy wstawi dowolny typ porwnywalny za pomoc <,
np. pair < int, int >. Wicej o tym i wyjanienie w czci II):
priority_queue<int, vector<int>, greater<int> > Q;
Innym sposobem, aby na szczycie kolejki byy maksymalne elementy, jest pomnoenie kadego
elementu przez -1 podczas woenia oraz pomnoenie przez -1 podczas wyjmowania.
Przykad programu
1 #include <i o s t r e a m >
2 #include <queue>
3 using namespace s t d ;
4 queue<int> Q;
5
6 int main ( ) {
7
p r i o r i t y q u e u e <int> Q1 ;
8
p r i o r i t y q u e u e <int , v e c t o r <int >, g r e a t e r <int> > Q2 ;
9
f o r ( int i =0; i <4; i ++) {
10
Q1 . push ( i ) ;
11
Q2 . push ( i ) ;
12
}
13
while ( ! Q1 . empty ( ) ) { // co j e s t j e d n o z n a c z n e z Q. empty ( ) == f a l s e
14
c o u t << Q1 . top ( ) << << Q2 . top ( ) << e n d l ;
15
Q1 . pop ( ) ;
16
Q2 . pop ( ) ;
17
}
18
return 0 ;
19 }
Wypisze na ekran:
3
2
1
0
0
1
2
3
64
ROZDZIA 4. WYKADY
4.2.8
STL poza szablonami struktur danych dostarcza nam take rnych algorytmw. Wikszo
z nich dziaa na tablicach/vectorach. Aby korzysta z wikszoci poniszych algorytmw, naley
doda lini na pocztku programu:
#include <algorithm>
Minimum, maksimum
Zacznijmy od najprostszych:
min(a,b) - znajdowanie minimum z dwch liczb
max(a,b) - znajdowanie maksimum z dwch liczb.
1
2
3
// le
// dobrze
Sortowanie
Wemy teraz najczciej wykorzystywany algorytm, ktry dodatkowo nie jest atwo zastampialny przez wasny kod sort. Dziaa on w czasie O(n log n). Warto powiedzie, e wasna
implementacja funkcji sortujcej, ktra byaby szybsza bd porwnywalna w szybkoci do sorta
(w szczeglnoci na duszych tablicach), jest bardzo pracochonna i na konkursach prawie zawsze wystarczy szybko, w jakiej dziaa sort (jeli nie, to da si posortowa dane w czasie
O(n)). Podstawowe uycie jest bardzo proste:
sort(V.begin(), V.end());
sort(t, t + n);
// posortowanie vectora v
// posortowanie tablicy t o liczbie elementw n;
ROZDZIA 4. WYKADY
1
2
2
0
2
2
0
0
1
1
2
2
2
1
2
2
0
2
1
2
0
2
0
1
2
2
1
2
2
0
2
1
2
0
1
0
Losowe permutowanie
Wemy teraz kolejny algorytm - random shuffle. Wykorzystanie jest takie same jak sorta,
tyle e elementy nie musz by porwnywalne. random shuffle losowo permutuje elementy vectora. Przykad:
random_shuffle(V.begin(), V.end());
66
Cze
II
,
Rozdzia 5
Zadania
5.1
Dzie prbny
Dostpna pami: 32 MB
Dzie 0, 19.09.2010
Kostki domina
Adrian ukada cigi z kostek domina. Kostki podzielone s na 2 pola z pewn liczb oczek.
Kostki mona obraca. Kostki dokadane s z obydwu stron tak, aby stykajce si pola miay
tak sam liczb oczek. Adrian ma n kostek. Wykorzystujc wszystkie kostki da si uoy
poprawny cig. Adrian zastanawia si, ile oczek bdzie z pocztku (p) i koca (k) cigu kostek.
Wejcie
W pierwszym wierszu wejcia znajduje si liczba n (1 6 n 6 106 ), oznaczajca liczb kostek
domina. W n kolejnych wierszach po 2 liczby cakowite ai , bi (1 6 ai , bi 6 109 ), oznaczajce
odpowiednio liczb oczek po lewej stronie oraz po prawej stronie i-tej kostki.
Wyjcie
W pierwszym i jedynym wierszu wyjcia liczby p i k, gdy p < k, w przeciwnym wypadku
k i p. Jeli wynik jest niejednoznaczny odpowiedzi powinno by sowo NIE.
Przykad
dla danych wejciowych:
2
3 2
3 4
poprawnym wynikiem jest:
2 4
69
5.2
ROZDZIA 5. ZADANIA
Dzie pierwszy
Zadanie: Sznurki
Dostpna pami: 32 MB
Dzie 1, 20.09.2010
Sznurki
Ja dosta od dziadka n sznurkw, ktre uoy w linii prostej jeden obok drugiego. Ja
zauway, e bez problemu moe poczy dwa ssiednie sznurki w jeden. Poczony sznurek
ma dugo rwn sumie dugoci obydwu sznurkw. Poczony sznurek Ja moe ponownie
poczy z ssiednim sznurkiem.
Ja chciaby mie jak najwicej sznurkw, jednak takich, aby kady z nich nie by krtszy
od jego wzrostu.
Wejcie
Pierwszy wiersz wejcia zawiera dwie liczby cakowite n, w (1 6 n, w 6 106 ), oznaczajce
odpowiednio liczb sznurkw oraz wzrost Jasia. Kolejny wiersz zawiera cig n liczb cakowitych
a1 , a2 , ...an (1 6 ai 6 106 ), oznaczajcych kolejne sznurki uoone od lewej do prawej.
Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb cakowit, rwn maksymalnej liczbie sznurkw jakie moe utworzy Jasio.
Przykad
dla danych wejciowych:
8 4
1 2 3 4 8 1 1 3
poprawnym wynikiem jest:
4
70
ROZDZIA 5. ZADANIA
Zadanie: Wiea
Dostpna pami: 32 MB
Dzie 1, 20.09.2010
Wiea
W Bajtocji wybudowano wysok wie. Wejcie na wie skada si z n schodkw, a kady
schodek ma pewn wysoko.
Bajtock wie chce odwiedzi m mieszkacw. Kada z osb posiada pewien wzrost, ktry
pomaga w pokonywaniu kolejnych schodkw. Aby mieszkaniec Bajtocji mg wej na pewien
schodek, to musi by wyszy od wysokoci schodka. Jeli pewien schodek jest nie do przejcia
przez mieszkaca, to zatrzymuje si on w danym miejscu na wiey wyej nie bdzie mg wej.
Znajc wysokoci kolejnych schodkw i osb zwiedzajcych wie chcielibymy wiedzie,
w ktrym miejscu zatrzyma si kady mieszkaniec Bajtocji.
Wejcie
Pierwszy wiersz wejcia zawiera dwie liczby cakowite n, m (1 6 n, m 6 500000), oznaczajce
odpowiednio liczb schodkw prowadzcych na wie oraz liczb mieszkacw chccych odwiedzi wie. Kolejny wiersz zawiera n liczb cakowitych a1 , a2 , ..., an (1 6 ai 6 109 ) , gdzie ai
oznacza wysoko i-tego schodka. Pierwszy schodek znajduje si na samym dole wiey, a kady
kolejny wyej od poprzednich. Nastpny wiersz wejcia zawiera m liczb cakowitych b1 , b2 , ..., bm
( 1 6 bi 6 109 ), gdzie bi oznacza wzrost i-tego mieszkaca.
Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera m liczb cakowitych w1 , w2 , ..., wm , gdzie
wi oznacza maksymalny numer schodka, na ktry moe wej i-ty mieszkaniec Bajocji.
Przykad
dla danych wejciowych:
3 6
2 5 1
1 2 3 4 5 6
poprawnym wynikiem jest:
0 0 1 1 1 3
71
ROZDZIA 5. ZADANIA
Zadanie: Tablica
Dostpna pami: 64 MB
Dzie 1, 20.09.2010
Tablica
Kacper i Adi bardzo polubili system dwjkowy. Kady z nich napisa na tablicy cig zer
i jedynek. Kacper chciaby teraz w kadym z tych cigw skreli niektre cyfry tak, eby
pozostae cigi byy takie same oraz byy uporzdkowane, tj. po pierwszym wystpieniu jedynki
nie moe ju wystpi adne zero. Jaki najduszy cig moe pozosta na tablicy?
Wejcie
Pierwszy wiersz wejcia zawiera dwie liczby cakowite n, m (1 6 n, m 6 106 ), oznaczajce
dugo cigw napisanych przez kolejno Kacpra i Adiego. W drugim wierszu znajduje si n
cyfr 0 lub 1 cig napisany przez Kacpra. W trzecim wierszu znajduje si m cyfr 0 lub 1 cig
napisany przez Adiego.
Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb dugo najduszego cigu
ktry moe pozosta na tablicy.
Przykad
dla danych wejciowych:
6 6
0 0 1 1 0 1
0 1 0 0 1 1
poprawnym wynikiem jest:
4
72
ROZDZIA 5. ZADANIA
5.3
Dzie drugi
Zadanie: Obwody
Dostpna pami: 32 MB
Dzie 2, 21.09.2010
Obwody
Ja na urodziny dosta komplet magicznych elektrycznych kabelkw. Kady kabelek skada
si z drutu oraz bateryjki. i-ty drut moe wytrzyma napicie di woltw, a i-ta bateryjka ma
napicie bi woltw.
Jasio buduje z kabelkw obwody: wybiera druty, skrca je razem tworzc grubszy drut i robi
z niego kko. W kku napicie jest sum napi wszystkich bateryjek, a skrcony drut moe
wytrzyma napicie bdce sum napi, ktre mog wytrzyma poszczeglne druty.
Ja buduje obwd tak, aby zrobione kko nie przepalio si. Z ilu maksymalnie kabelkw
moe si ono skada?
Wejcie
W pierwszym wierszu wejcia znajduje si jedna liczba cakowita n (1 6 n 6 500000),
oznaczajca liczb drutw. W n nastpnych linijkach pary liczb di , bi opisujce kolejne druty
(1 6 di , bi 6 106 ).
Wyjcie
W jedynej linijce powinna znale si liczba cakowita, oznaczajca maksymaln liczb drutw tworzcych kko.
Przykad
dla danych wejciowych:
2
2 2
2 2
poprawnym wynikiem jest:
2
73
ROZDZIA 5. ZADANIA
Zadanie: Wiea 2
Dostpna pami: 32 MB
Dzie 2, 21.09.2010
Wiea 2
W Bajtocji wybudowano wysok wie. Wejcie na wie skada si z n schodkw, a kady
schodek ma pewn wysoko.
Bajtock wie chce odwiedzi m mieszkacw. Kada z osb posiada pewien wzrost, ktry
pomaga w pokonywaniu kolejnych schodkw. Aby mieszkaniec Bajtocji mg wej na pewien
schodek, to musi by wyszy od wysokoci schodka. Jeli pewien schodek jest nie do przejcia
przez mieszkaca, to zatrzymuje si on w danym miejscu na wiey wyej nie bdzie mg wej.
Niestety schody na wie s bardzo wskie i jeli pewna osoba zatrzyma si, to kada kolejna
nie bdzie moga ju wej wyej bdzie musiaa zatrzyma si schodek wczeniej.
Znajc wysokoci kolejnych schodkw i wzrost kolejnych osb zwiedzajcych wie, chcielibymy wiedzie, w ktrym miejscu zatrzyma si kady mieszkaniec Bajtocji.
Wejcie
Pierwszy wiersz wejcia zawiera dwie liczby cakowite n, m (1 6 n, m 6 500000), oznaczajce
odpowiednio liczb schodkw prowadzcych na wie oraz liczb mieszkacw chccych odwiedzi wie. Kolejny wiersz zawiera n liczb cakowitych a1 , a2 , ..., an (1 6 ai 6 109 ) , gdzie ai
oznacza wysoko itego schodka. Pierwszy schodek znajduje si na samym dole wiey, a kady
kolejny wyej od poprzednich. Nastpny wiersz wejcia zawiera m liczb cakowitych b1 , b2 , ..., bm
( 1 6 bi 6 109 ), gdzie bi oznacza wzrost i-tego mieszkaca.
Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera m liczb cakowitych w1 , w2 , ..., wm , gdzie
wi oznacza maksymalny numer schodka, na ktry moe wej i-ty mieszkaniec Bajocji.
Przykad
dla danych wejciowych:
3 4
2 5 1
6 5 4 3
poprawnym wynikiem jest:
3 1 0 0
74
ROZDZIA 5. ZADANIA
Zadanie: Akwarium
Dostpna pami: 64 MB
Dzie 2, 21.09.2010
Akwarium
Kozik dosta w prezencie na urodziny akwarium z mieczykami. Obserwowanie mieczykw
szybko mu si znudzio, poniewa wedug Kozika nigdy nie dziao si nic nowego. Dlatego te
mieczyki szybko sprzeda, a za zarobione pienidze kupi w promocji pewne afrykaskie ryby.
Afrykaska ryba ma okrelon mas i wiek oraz charakteryzuje si tym, e musi codziennie
zaspokoi swj gd. Jeli nie dostanie nic do jedzenia, to poera inn, mniejsz ryb. Jeli
kilka ryb jest godnych, to pierwszestwo ma zawsze ryba o najwikszej masie, ktra wybiera
swoj ofiar (w przypadku rwnych mas pierwszestwo ma ryba starsza). Ofiar bdzie zawsze
najmniejsza ryba znajdujca si w akwarium (jeli kilka ryb ma tak sam mas, ofiar z nich
bdzie najmodsza ryba). Dodatkowo afrykaska ryba zwiksza swoj mas o poow masy
zjedzonej przez ni innej ryby. Jeli afrykaska ryba nie zaspokoi swojego godu w cigu dnia,
zdycha. Kilka ryb moe mie rwne masy, natomiast wszystkie ryby s innego wieku.
Kozik zastanawia si, czy pewna ryba r, wybrana przez niego, bdzie ya za x dni.
Wejcie
Pierwszy wiersz standardowego wejcia zawiera jedn liczb cakowit n (1 6 n 6 106 ),
oznaczajc liczb ryb w akwarium. W n kolejnych wierszach znajduj si po dwie liczby cakowite mi , wi (1 6 mi , wi 6 109 ), oznaczajce odpowiednio mas i wiek i tej ryby. W kolejnym
wierszu znajduje si jedna cakowita z (1 6 z 6 106 ), ozaczajca liczb zapyta Kozika. W z nastpnych wierszach znajduj si po dwie liczby cakowite rk , xk (1 6 rk 6 n, 0 6 xk 6 109 ),
oznaczajce pytanie: czy ryba rk bdzie ya za xk dni?.
Wyjcie
Dla kadego zapytania sowo TAK, jeli ryba rk bdzie ya za xk dni, w przeciwnym
wypadku sowo NIE.
Przykad
dla danych wejciowych:
4
2
4
7
8
2
2
3
1
2
3
4
1
1
5.4
ROZDZIA 5. ZADANIA
Dzie trzeci
Zadanie: Tarasy
Dostpna pami: 32 MB
Dzie 3, 22.09.2010
Tarasy
W bajtockich grach wybudowano tarasy widokowe poczone za pomoc wind. Z tarasu
pooonego niej mona wjecha na taras ssiedni, pooony wyej, za tyle kredytek ile wynosi
rnica pomidzy wysokociami tarasw. Z tarasu pooonego wyej na taras pooony niej
zjeda si za darmo. Tarasy poczone s w acuch widokowy, w ktrym z pierwszego tarasu
mona dosta si tylko na drugi, z drugiego na pierwszy i trzeci, itd.
Policz, jaka jest najwiksza liczba rnych tarasw, ktre bezporednio (czyli bez zjedania
z tarasu na ziemi) moe odwiedzi turysta posiadajcy tylko k kredytek. Za wjazd na taras,
od ktrego zacznie swoj wdrwk, turysta nic nie paci.
Wejcie
W pierwszym wierszu podane s dwie liczby cakowite n, k (1 6 n 6 105 , 0 6 k 6 105 ),
oddzielone pojedynczym odstpem. Liczba tarasw to n, a k to liczba kredytek, ktrymi dysponuje turysta. W kolejnych n wierszach podane s wysokoci kolejnych tarasw: h1 , h2 , ..., hn .
Kade hi spenia nierwnoci: 1 6 hi 6 104 .
Wyjcie
Program powinien wypisa tylko jedn liczb, rwn najwikszej liczbie tarasw, ktre moe
odwiedzi turysta za k kredytek.
Przykad
dla danych wejciowych:
5 1
4
2
1
2
4
poprawnym wynikiem jest:
4
76
ROZDZIA 5. ZADANIA
Dostpna pami: 32 MB
Dzie 3, 22.09.2010
Rolki papieru
Ostatnio Kozik, bdc na wszystkich lekcjach w szkole, by zmuszony do odwiedzenia toalety.
Zdziwi si bardzo, gdy znajdowao si tam n rolek papieru toaletowego. Zdenerwowao go jednak to, e nie wszystkie rolki wyglday tak samo, gdy nie byy rozwinite na te same dugoci.
Postanowi wic poprawi wygld toalety i rozwin lub zwin rolki tak, aby wszystkie byy
rozwinite na t sam dugo.
Jeden ruch polega na zwiniciu lub rozwiniciu 1 cm rolki. Kada rolka ma okrelon dugo
oraz rozwinicie. Dugo rozwinicia nie moe przekracza dugoci rolki. Pom Kozikowi
uporzdkowa rolki w jak najmniejszej liczbie ruchw.
Wejcie
W pierwszym wierszu wejcia znajduje si jedna liczba cakowita n (1 6 n 6 106 ), oznaczajca liczb rolek. W n kolejnych wierszach znajduje si opis i tej rolki w postaci dwch liczb cakowitych di i ri oznaczajcych odpowiednio dugo i rozwinicie i tej rolki (0 6 ri 6 di 6 109 ).
Wyjcie
W jedynym wierszu wyjcia powinna znajdowa si jedna liczba cakowita, rwna minimalnej
liczbie ruchw Kozika.
Przykad
dla danych wejciowych:
3
50 10
40 20
30 30
poprawnym wynikiem jest:
20
77
ROZDZIA 5. ZADANIA
Zadanie: Karty
Dostpna pami: 32 MB
Dzie 3, 22.09.2010
Karty
Tasujemy tali kart za pomoc nastpujcych operacji:
A - przeoenie pierwszej karty z gry na d stosu
B - przeoenie drugiej karty z gry na d stosu
Twoim zadaniem jest obliczy ktra karta bdzie na grze n-elementowej talii kart po k operacjach. Karty s ponumerowane kolejno od gry liczbami od 1 do n.
Wejcie
W pierwszym wierszu znajduj si dwie liczby cakowite n i k (1 6 n, k 6 2000000). W drugim wierszu znajduje si k znakw: A lub B, oznaczajcych rodzaj kolejnych operacji na talii
kart.
Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn licz cakowit numer karty
na grze stosu.
Przykad
dla danych wejciowych:
6 6
ABBABA
poprawnym wynikiem jest:
1
78
ROZDZIA 5. ZADANIA
5.5
Dzie czwarty
Zadanie: Las
Dostpna pami: 64 MB
Dzie 4, 23.09.2010
Las
Pan Jan posiada spory teren lasu obejmujcy kwadratowy teren o boku n. Rozmieszczonych
jest tam n2 drzew, po n drzew w kadym wierszu i po n drzew w kadej kolumnie. Kade drzewo
ma okrelony wiek. Pan Jan chce zbudowa dom o powierzchni d, jednak w tym celu musi wyci
pewien fragment swojego lasu (a dokadniej d drzew, poniewa kade drzewo zajmuje 1 jednostk
powierzchni). Fragment ten musi by oczywicie spjny.
Pan Jan zastanawia si teraz, ktry fragment wybra. Chciaby, aby najstarsze drzewo
ze wszystkich wycitych byo moliwie najmodsze.
Wejcie
Pierwszy wiersz standardowego wejcia zawiera dwie liczby cakowite n i d (1 6 d 6 n 6
1 000), oznaczajce odpowiednio wielko terenu oraz powierzchni domu ktry chce zbudowa
pan Jan. Kolejnych n wierszy zawiera po n liczb cakowitych w(i, k) (1 6 w(i, k) 6 109 ),
oznaczajcych wiek drzewa stojcego w i tym wierszu i k tej kolumnie.
Wyjcie
Pierwszy wiersz standardowego wyjcia powinien zawiera jedn liczb cakowit, rwn
minimalnemu wiekowi najstarszego drzewa ze wszystkich wycitych.
Przykad
dla danych wejciowych:
5
3
3
6
1
1
6
4
1
9
7
1
1
2
1
9
1
2
4
1
4
1
4
6
7
3
6
79
ROZDZIA 5. ZADANIA
Zadanie: Domino
Dostpna pami: 32 MB
Dzie 4, 23.09.2010
Domino
Ja ukada domino. Nie robi tego jednak w tradycyjny sposb, tylko bawi si w przewracanie
kolejnych klockw domina. Wiemy, e klocki Jasia s rnych wysokoci.
Ja postawi n klockw domina w cigu w taki sposb, aby przewrcenie si dowolnego klocka
spowodowao przewrcenie si kolejnego klocka w cigu. Wiadomo, e kolejny klocek przewrci
si, jeli wysoko przewracanego klocka jest wiksza od odlegoci pomidzy nimi.
Ja chciaby wiedzie, ile niepotrzebnych klockw moe usun z cigu, aby przewrcenie
pierwszego klocka w cigu spowodowao (poprzez przewracanie si porednich klockw) przewrcenie si ostatniego klocka w cigu. Ja nie moe zmienia pooenia klockw.
Wejcie
Pierwszy wiersz standardowego wejcia zawiera jedn liczb cakowit n (1 6 n 6 106 ), oznaczajc liczb klockw Jasia. Drugi wiersz wejcia zawiera cig n liczb cakowitych w1 , w2 , ..., wn
(1 6 wi 6 109 ), gdzie wi oznacza wysoko i tego klocka w cigu. Trzeci wiersz wejcia zawiera
odlegoci pomidzy klockami w cigu. Skada si z cigu n 1 liczb cakowitych x1 , x2 , ..., xn1
(1 6 xi 6 109 ), gdzie xi oznacza odlego pomidzy i tym a i + 1 wszym klockiem w cigu.
Wyjcie
Pierwszy i jedyny wiesz standardowego wyjcia powinien zawiera jedn liczb cakowit
rwn maksymalnej liczbie klockw, ktre moemy usun z cigu.
Przykad
dla danych wejciowych:
5
4 2 3 2 1
2 1 1 1
3
2
2
1
80
ROZDZIA 5. ZADANIA
Zadanie: Suma
Dostpna pami: 32 MB
Dzie 4, 23.09.2010
Suma
Od kiedy Adi przesta zajmowa si ogrodnictwem, to caymi dniami siedzi w swoim pokoju
analizujc wasnoci liczb w zapisie binarnym.
Od tego czasu nka go nastpujcy problem: znalezienie sumy wszystkich dodatnich liczb
cakowitych, ktre w zapisie binarnym maj co najwyej k cyfr. Adi nie ma pomysu, jak si do
tego zabra, wic o pomoc poprosi Ciebie.
Wejcie
Pierwszy wiersz wejcia zawiera jedn liczb cakowit k (1 6 k 6 106 ).
Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb sum dodatnich liczb
cakowitych, ktre w zapisie binarnym maj co najwyej k cyfr. Liczb t naley wypisa
w systemie dwjkowym.
Przykad
dla danych wejciowych:
3
poprawnym wynikiem jest:
11100
81
5.6
ROZDZIA 5. ZADANIA
Dzie pity
Zadanie: Wykres
Dostpna pami: 32 MB
Dzie 5, 24.09.2010
Wykres
Duch Adi bardzo przykada si do startw w konkursie Ghostcoder. Podczas kadych zawodw s do zrobienia dokadnie 2 zadania. Zatem wynik z danych zawodw mona opisa jako
liczb zrobionych zada nalec do zbioru 0, 1, 2.
Adi bardzo skrupulatnie notuje wyniki z kolejnych konkursw. Teraz chciaby si pochwali
swoimi postpami przed kolegami, czyli chciaby wybra wyniki z pewnych zawodw tak, aby ich
wykres by rosncy i zarazem jak najduszy.
Wejcie
Pierwszy i jedyny wiersz wejcia zawiera liczb cakowit n (1 6 n 6 106 ), oznaczajc liczb
zawodw, w ktrych bra udzia Adi. W nastpnym wierszu znajduje si n liczb, oznaczajcych
wyniki Adiego w kolejnych zawodach.
Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb, oznaczajc dugo najduszego rosncego wykresu jaki moe uzyska Adi.
Przykad
dla danych wejciowych:
5
1 0 2 1 2
poprawnym wynikiem jest:
3
82
ROZDZIA 5. ZADANIA
Zadanie: Turniej
Dzie 5, 24.09.2010
Turniej
W Bajtockim Turnieju Programistycznym bierze udzia n zawodnikw. Kady zawodnik ma
pewn si i wiadomo, e dwch rnych zawodnikw nie posiada takiej samej siy.
Codziennie odbywane s zawody z udziaem zawodnikw, ktrzy zakwalifikowali si z dnia
poprzedniego. W jednym dniu zawodnicy dzieleni s losowo na pewn liczb grup po k osb,
spord ktrych odpada zawsze osoba z najmniejsz si (pozostaych k 1 osb zostaje zwycizcami w danej grupie). Moe si zdarzy, e jedna grupa nie bdzie posiadaa k osb. W tym
wypadku wszystkie osoby z danej grupy przechodz automatycznie do zawodw nastpnego dnia.
Turniej si koczy, jeli nie mona ju podzieli osb na co najmniej jedn grup o liczbie osb
k. W caym turnieju szukamy wic k 1 zwycizcw.
Zastanawiamy si ile rnych osb moe zwyciy w tym turnieju.
Wejcie
Pierwszy wiersz standardowego wejcia zawiera jedn liczb cakowit z (1 6 z 6 100),
oznaczajc liczb zestaww danych. Kady zestaw danych zawiera po dwie liczby cakowite ni
i ki (2 6 ki , ni 6 106 ), oznaczajce odpowiednio liczb osb biorcych udzia w turnieju, oraz
liczb osb, na ktre dzielone s grupy.
Suma n dla wszystkich zestaww danych nie przekroczy wartoci 106 .
Wyjcie
Dla kadego zapytania w osobnym wierszu powinna znale si jedna liczba cakowita oznaczajca liczb rnych osb, ktre mog by zwycizcami w caym turnieju.
Przykad
dla danych wejciowych:
1
2 2
poprawnym wynikiem jest:
1
83
ROZDZIA 5. ZADANIA
Zadanie: Przyjcie
Dostpna pami: 32 MB
Dzie 5, 24.09.2010
Przyjcie
Maa Kasia urzdza przyjcie urodzinowe. Na t okazj kupia n rodzajw cukierkw. Liczba
cukierkw k tego rodzaju wynosi xk . Kasia nie prbowaa adnego rodzaju cukierka, dlatego
chciaaby zaprosi tylu goci, aby po rwnomiernym rozdzieleniu cukierkw midzy goci pozosta jej co najmniej jeden cukierek kadego rodzaju.
Kasia rozdziela cukierki w taki sposb, e kady go musi dosta t sam liczb cukierkw k
tego rodzaju. Dodatkowo jeli Kasia moe wybra t liczb na rne sposoby, to musi wybra
maksymaln z nich (przykadowo Kasia ma 10 cukierkw i rozdziela je 4 osobom. Moe da
kadej osobie po 0, 1 lub 2 cukierki, wic daje maksymaln liczb, czyli 2). Cukierkw nie mona
dzieli na mniejsze czci.
Kasia nie jest zbyt towarzyska, wic zastanawia si, jak najmniejsz liczb osb powinna
zaprosi, aby spenione byy warunki zadania.
Wejcie
Pierwszy wiersz standardowego wejcia zawiera jedn liczb cakowit n, oznaczajca liczb
rnych rodzajw cukierkw (1 6 n 6 106 ). Drugi wiersz zawiera n liczb cakowitych xk
(1 6 xk 6 105 ) oddzielonych spacj, oznaczajcych liczb cukierkw k tego rodzaju.
Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn liczb cakowit, rwn minimalnej
liczbie osb.
Przykad
dla danych wejciowych:
4
2 4 9 10
poprawnym wynikiem jest:
6
84
Rozdzia 6
Rozwizania
6.1
Dzie prbny
Dostpna pami: 32 MB
Dzie 0, 19.09.2010
Kostki domina
Uproszczenie zadania
Zadanie duo atwiej jest rozwiza, jeli zinterpretujemy je w teorii grafw. Wyobramy sobie, e mamy jak ciek w grafie idc po wierzchokach (v1 , v2 , ..., vn ). Zauwamy, e jest ona
jednoznaczna z uoeniem w acuch nastpujcych kostek domina:([v1 , v2 ], [v2 , v3 ], ..., [vn1 , vn ]).
Zatem moemy stworzy sobie graf nieskierowany, ktry jako zbir krawdzi zawiera wszystkie kostki domina (jeli mamy kostk [x, y] to dodajemy krawd midzy wierzchokami x, y),
a jako zbir wierzchokw wszystkie wierzchoki o stopniu co najmniej 1 (czyli e co najmniej 1
krawd koczy si w danym wierzchoku).
1 2
3
3
2 3
4
4
Rysunek przedstawiajcy zamian kostek domina na graf. Przykadowe kostki [1,2], [2,3],
[3,4], [3,4], [3,5].
85
ROZDZIA 6. ROZWIZANIA
Cig uoony ze wszystkich kostek bdzie jednoznaczny ze ciek Eulera w takim grafie.
cieka Eulera to taka cieka, ktra przechodzi po wszystkich krawdziach grafu dokadnie jeden
raz. Jednake musi by moliwa do uoenia tylko jedna taka cieka. Zatem nie moe istnie
w danym grafie Cykl Eulera (czyli e istnieje cykl przechodzcy po wszystkich krawdziach),
bo wtedy moe by wiele rnych odpowiedzi (kada para vx , vx ).
W zadaniu zaley nam wic, aby znale wierzchoek pocztkowy i kocowy cieki Eulera.
Rozwizanie wzorcowe
W naszym rozwizaniu przydatne bdzie nastpujce twierdzenie:
Twierdzenie.1. Twierdzenie o cyklu Eulera. Niepusty graf spjny ma cykl Eulera wtedy
i tylko wtedy, gdy stopie kadego wierzchoka jest liczb parzyst.
Twierdzenie.2. Twierdzenie o ciece Eulera. Niepusty graf spjny ma ciek Eulera,
ale nie ma cyklu Eulera wtedy i tylko wtedy, gdy stopie kadego, oprcz dwch wierzchokw, jest
liczb parzyst. Wtedy ta cieka zaczyna si w jednym z tych wierzchokw, a koczy w drugim.
W zadaniu zaley nam, aby znale wierzchoek pocztkowy i kocowy cieki Eulera. Na podstawie powyszego twierdzenia wida, e musz by to dwa rne wierzchoki o stopniu nieparzystym. Poza tym wszystkie pozostae wierzchoki musz mie stopie parzysty oraz graf musi
by spjny.
Wiemy, e cieka zawsze istnieje, wic bd to wierzchoki o stopniu nieparzystym. Moemy
to zrobi w taki sposb, e dodajemy do wektora pary [a, b] oraz [b, a], nastpnie sortujemy wektor
i dla danego x liczymy, ile jest par [x, a] (bd one obok siebie w posortowanym wektorze).
Naley sprawdzi jeszcze dwa szczeglne przypadki, gdy graf ma 1 bd 2 wierzchoki (pamitajmy, e moe by bardzo duo klockw). Wtedy nawet jeli istnieje cykl Eulera, to istnieje
jednoznaczny sposb stworzenia cieki.
86
ROZDZIA 6. ROZWIZANIA
6.2
Dzie pierwszy
Opracowanie: Sznurki
Dostpna pami: 32 MB
Dzie 1, 20.09.2010
Sznurki
Rozwizanie wzorcowe
Zadanie rozwizujemy zachannie. Poczynajc od pierwszego sznurka czymy go z kolejnymi, dopki nie utworz cznej dugoci nie mniejszej od wzrostu Jasia. Nastpnie bierzemy
kolejny sznurek i czymy z nastpnymi.
Zauwamy, e takie postpowanie jest optymalne, gdy pierwszy sznurek moemy poczy
tylko ze sznurkiem drugim, a jeli jego dugo nie jest sama w sobie wystarczajca, to opaca
si go wykorzysta zwikszajc inny sznurek (a mamy tylko jedn moliwo). Po poczeniu
drugi sznurek staje si pierwszym i postpujemy analogicznie.
1
2
3
4
5
6
7
8
9
10
wczytaj (n , wzrost )
suma := 0
wynik := 0
f o r k := 1 to n do
wczytaj ( x )
suma := suma + x
i f suma >= w z r o s t then
wynik := wynik + 1
suma := 0
wypisz ( wynik )
87
ROZDZIA 6. ROZWIZANIA
Opracowanie: Wiea
Dostpna pami: 32 MB
Dzie 1, 20.09.2010
Wiea
Rozwizanie wzorcowe
Zadanie rozwiemy za pomoc wyszukiwania binarnego. Dla kadego schodka naley znale
wysoko schodka o najwikszej wysokoci, lecego na drodze od samego dou wiey do miejsca
danego schodka (np. dla kolejnych wysokoci schodkw 1, 5, 3, 6, 2, 1, 7 stworzymy cig 1,
5, 5, 6, 6, 6, 7). Otrzymany cig bdzie niemalejcy, dziki temu bdziemy mogli wykona na
nim wyszukiwanie binarne. Dla kadego mieszkaca moemy w czasie O(log n) znale miejsce,
w ktrym si zatrzyma, bdzie to pierwszy wyszy bd rwny klocek od jego wzrostu.
1
2
3
4
5
6
7
w c z y t a j ( n , m, schodek [ ] , m i e s z k a n i e c [ ] )
c i a g [ ] := 0
f o r k := 1 to n do
c i a g [ k ] := max( c i a g [ k 1] , schodek [ k ] )
f o r k := 1 to m do
m i e j s c e := w y s z u k a j b i n a r n i e ( m i e s z k a n i e c [ k ] )
wypisz ( m i e j s c e )
Poniewa mamy m mieszkacw, to zoono caego rozwizania wyniesie O(m log n), co nas
cakowicie satysfakcjonuje.
88
ROZDZIA 6. ROZWIZANIA
Opracowanie: Tablica
Dostpna pami: 64 MB
Dzie 1, 20.09.2010
Tablica
Rozwizanie wzorcowe
Dla kadego z cigw a i b policzmy tablice pozA[] i pozB[] oznaczajce dla indeksu i
numer pozycji w cigu, na ktrej wystpi i-te zero, oraz tablice suf A[] i suf B[] oznaczajce
dla indeksu i, ile jest jedynek w podcigu [i...n] danego cigu.
Zamy, e w optymalnym rozwizaniu wystpuje i zer, wwczas ostatnie zero wystpi
w cigu a na pozycji pozA[i]. Poniewa ostatnie zero wystpio na pozycji pozA[i] i wicej zer
ju nie wystpi (bo zaoylimy, e bierzemy dokadnie i zer), moemy do wynikowego cigu
doda wszystkie jedynki z pozycji [pozA[i] + 1...n], a liczba takich jedynek to suf A[pozA[i] + 1].
Jednak w cigu a i b musimy wzi tak sam liczb jedynek. Liczba tych jedynek bdzie wic
wynosia min(suf A[pozA[i] + 1], suf B[pozB[i] + 1]).
Obliczamy wic dla kadego i warto i + min(suf A[pozA[i] + 1], suf B[pozB[i] + 1]). Wynikiem bdzie maksymalna z tych wartoci.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
w c z y t a j ( n , m, a [ ] , b [ ] )
A i l e 0 := 0
B i l e 0 := 0
wynik := 0
f o r i := 1 to n do
i f a [ i ] = 0 then
A i l e 0 := A i l e 0 + 1
pozA [ A i l e 0 ] := i
f o r i := 1 to m do
i f b [ i ] = 0 then
B i l e 0 := B i l e 0 + 1
pozB [ B i l e 0 ] := i
f o r i := n downto 1 do
sufA [ i ] := sufA [ i +1]
i f a [ i ] = 1 then
sufA [ i ] := sufA [ i ]
f o r i := m downto 1 do
sufB [ i ] := sufB [ i +1]
i f b [ i ] = 1 then
sufB [ i ] := sufB [ i ]
f o r i := 1 to min ( A i l e 0 ,
wynik := max( wynik , i
wypisz ( wynik )
+ 1
+ 1
B i l e 0 ) do
+ min ( sufA [ pozA [ i ] + 1 ] , sufB [ pozB [ i ] + 1 ] ) )
89
6.3
ROZDZIA 6. ROZWIZANIA
Dzie drugi
Opracowanie: Obwody
Dostpna pami: 32 MB
Dzie 2, 21.09.2010
Obwody
Rozwizanie wzorcowe
Mamy znale najwiksz liczb drutw, tak e bi 6 di , innymi sowy 0 6 di bi .
Dla kadego drutu obliczamy di bi , po czym sortujemy te liczby i liniowo (od najwikszej)
sumujemy wartoci di bi dopki suma jest nieujemna.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
wczytaj (n)
f o r i := 1 to n do
wczytaj kolejny drut (d , b)
t [ i ] := d b
posortuj ( t [ ] )
suma := 0
wynik := 0
f o r i := n downto 1 do
suma := suma + t [ i ]
i f suma >= 0 then
wynik := wynik + 1
else
break
wypisz ( wynik )
Ze wzgldu na sortowanie rozwizanie bdzie wic miao zoono O(n log n). Zadanie mona
jednak rozwiza liniowo, czyli w czasie O(n), wykorzystujc sortowanie przez zliczanie.
90
ROZDZIA 6. ROZWIZANIA
Opracowanie: Wiea 2
Dostpna pami: 32 MB
Dzie 2, 21.09.2010
Wiea 2
Rozwizanie wzorcowe
Na pocztku dla kadego schodka naley znale wysoko schodka o najwikszej wysokoci
lecego na drodze od samego dou wiey do miejsca danego schodka (np. dla kolejnych wysokoci schodkw 1, 5, 3, 6, 2, 1, 7 stworzymy cig 1, 5, 5, 6, 6, 6, 7). Otrzymany cig bdzie
niemalejcy.
Nastpnie dla pierwszego mieszkaca w kolejce znajdujemy miejsce jego zatrzymania si.
Poruszamy si od wierzchoka wiey w d. Wiemy, ze kolejna osoba z kolejki zatrzyma si
najwyej jedno miejsce niej od poprzedniego mieszkaca. Kolejne wyszukiwanie zaczynamy
wic od miejsca zatrzymania si poprzedniego mieszkaca. W ten sposb przejrzymy kady
schodek dokadnie jeden raz, dziki czemu zoono caego rozwizania wynosi bdzie O(n+m).
1
2
3
4
5
6
7
8
9
10
11
w c z y t a j ( n , m, schodek [ ] , m i e s z k a n i e c [ ] )
c i a g [ ] := 0
f o r k := 1 to n do
c i a g [ k ] := max( c i a g [ k 1] , schodek [ k ] )
m i e j s c e := n
f o r k := 1 to m do
while c i a g [ m i e j s c e ] >= m i e s z k a n i e c [ k ] do
m i e j s c e := m i e j s c e 1
wypisz ( m i e j s c e )
i f m i e j s c e > 0 then
m i e j s c e := m i e j s c e 1
91
ROZDZIA 6. ROZWIZANIA
Opracowanie: Akwarium
Dostpna pami: 64 MB
Dzie 2, 21.09.2010
Akwarium
Spostrzeenia
Najwaniejszym spostrzeeniem jest to, e w kadym dniu umiera co najmniej poowa yjcych ryb jeli liczba ryb jest parzysta, to poowa najciszych zjada najlejsz poow, jeli jest
nieparzysta, to dodatkowo rodkowa ryba umiera, gdy nie ma kogo zje. Dziki temu moemy
zauway, e ryby mog y co najwyej log n dni, czyli dla maksymalnej wartoci n ryby mog
y co najwyej 20 dni. Z powodu tak maej liczby dni moemy atwo przeprowadzi symulacj.
Rozwizanie wzorcowe
W rozwizaniu najpierw znajdujemy dla kadej ryby dzie jej mierci, a nastpnie w czasie
staym odpowiadamy na kade z pyta. Aby znale dzie mierci kadej z ryb, postpujemy
wedug nastpujcych krokw:
1. Ustal, e dzie to 1.
2. Niech V to vektor wszystkich ryb.
3. Posortuj V tak, aby najpierw byy ryby najlejsze, a w przypadku takiej samej wagi
najmodsze.
4. Niech a to zerowy indeks wektora, b to indeks ostatniego elementu.
5. Dopki a < b powtarzaj krok 6.
6. Ustal, e ryba spod b zjada ryb spod a, dodaj najedzon ju ryb (ze zwikszon wag)
spod b do wektora V2 i ustal, e ryba spod a umiera dzisiaj. Nastpnie powiksz a o 1
i pomniejsz b o 1.
7. Jeli a == b to ustaw, e ryba a umiera dzisiaj (gdy nie moe nikogo zje)
8. Teraz niech V = V2 i jeli V2 nie jest pusty wyczy V2 , powiksz dzie o 1 oraz wr
do punktu 3.
Po przejciu takiego algorytmu moemy w czasie staym odpowiada, kiedy kada z ryb umara.
Powyszy algorytm dziaa w czasie O(n(log n)2 ). W C++ mona go bardzo atwo zrealizowa
z uyciem STL (dodatkowe informacje na temat vectorw i sortowania w wykadzie Praktyczne
zastosowanie STL).
92
ROZDZIA 6. ROZWIZANIA
6.4
Dzie trzeci
Opracowanie: Tarasy
Dostpna pami: 32 MB
Dzie 3, 22.09.2010
Tarasy
Rozwizanie wzorcowe
Niech r1 , r2 , ..., rn1 to koszty kolejnych przejazdw z ri do ri+1 . Warto zauway, e adna
z tych wartoci nie bdzie ujemna. Interesuje nas znalezienie jak najduszego spjnego podcigu
tego cigu takiego, e jego suma jest mniejsza rwna k. Wtedy najwiksza liczba tarasw, ktre
moe odwiedzi turysta za k kredytek, to dugo tego podcigu plus jeden. Taki podcig
moemy znale za pomoc tzw. dwch wskanikw, czyli:
1. Najpierw niech a = 0 oraz b to jak najdalszy indeks taki, e suma r0 + r1 + ... + rb1 + rb
jest mniejsza rwna k.
2. Ustalamy, e potencjalny wynik to (b a + 1).
3. Dla kadego a od 1 do n 1 zrb punkt 4.
4. Przesu b jak najdalej w prawo, tak aby suma ra + ra+1 + ... + rb1 + rb pozostaa mniejsza
rwna k. Sprawd, czy nowe (ba+1) nie jest wiksze od potencjalnego wyniku. Jeli tak,
to ustal nowy potencjalny wynik na (b a + 1).
5. Wypisz wynik.
Wiadomo, e jeli powikszymy a o 1 oraz b pozostanie takie samo to ra + ra+1 + ... + rb1 + rb
zmaleje bd pozostanie takie same (gdy ra nie byo ujemne). Zatem moemy sprbowa
przesun b w prawo. Przesunicie w lewo nie jest opacalne, gdy suma zmalaa.
Zauwamy, e powyszy program ma zoono liniow, gdy oba wskaniki a i b kad
komrk tablicy odwiedz tylko raz (poniewa tylko wzrastaj a nie malej).
93
ROZDZIA 6. ROZWIZANIA
Dostpna pami: 32 MB
Dzie 3, 22.09.2010
Rolki papieru
Obserwacja
Pierwsz obserwacj jest to, e kocowa dugo wszystkich rolek nie moe przekroczy
dugoci najkrtszej rolki. W zwizku z tym, dugo, do ktrej musimy rozwin wszystkie
rolki, jest z przedziau [0, dmin = min(d1 , d2 , .., dn )].
Rozwizanie brutalne
Dla kadego rozwinicia [0, dmin] sprawdzamy, o ile centymetrw bdziemy musieli zmieni
rozwinicie danej rolki i wybieramy najlepsz warto rozwinicia.
1
2
3
4
5
6
7
8
9
10
11
12
13
wczytaj (n , d [ ] , r [ ] )
dmin := 109
f o r i := 1 to n do
i f d [ i ] < dmin then
dmin := d [ i ]
wynik := 1016
f o r j := 0 to dmin do
tmp:=0
f o r i := 1 to n do
tmp := tmp + abs ( r [ i ] j )
i f tmp < wynik then
wynik := tmp
wypisz ( wynik )
Zoono czasowa takiego rozwizania to O(n dmin), co dla maksymalnych danych moe by
rwne 106 109 , czyli stanowczo za duo.
Rozwizanie wzorcowe
Nasz problem wyglda w nastpujcy sposb:
Mamy pewien cig liczb i chcemy wskaza tak liczb, aby suma rnic bezwzgldnych z wszystkimi liczbami z naszego cigu bya jak najmniejsza. Okazuje si, e takie wasnoci ma mediana,
czyli rodkowa liczba w posortowanym cigu (jeli w cigu jest parzysta liczba liczb to moemy
wybra dowoln z dwch rodkowych). Pozostaje jeszcze problem, gdy nasza mediana jest wysza ni warto dmin. atwo zauway, i im dalej oddalamy si od mediany, tym bardziej
ronie liczba potrzebnych ruchw, a wic wtedy nasz wartoci, do ktrej wyrwnujemy, jest
dmin.
94
ROZDZIA 6. ROZWIZANIA
1
2
3
4
5
6
7
8
9
10
11
wczytaj (n , d [ ] , r [ ] )
dmin := 109
f o r i := 1 to n do
i f d [ i ] < dmin then
dmin := d [ i ]
posortuj ( r )
mediana := min ( dmin , d [ n/2 + 1 ] )
wynik := 0
f o r i := 1 to n do
wynik := wynik + abs ( r [ i ] mediana )
wypisz ( wynik )
Jak wida, wikszo operacji wykonuje si liniowo wzgldem n, jedynie sortowanie bdzie nas
kosztowa O(n log n) operacji, a wic zoono caego programu to O(n log n), co jest wystarczajce dla n = 106
Zauwamy jeszcze, e wynik moe by liczb przekraczajc 232 , a wic do liczenia wyniku
naley uy zmiennych 64-bitowych.
95
ROZDZIA 6. ROZWIZANIA
Opracowanie: Karty
Dostpna pami: 32 MB
Dzie 3, 22.09.2010
Karty
Rozwizanie wzorcowe
Bdziemy symulowa kolejno kart w talii, zgodnie z podanymi na wejciu operacjami.
Do symulowania talii kart wykorzystamy kolejk, w ktrej bdziemy trzyma karty na pozycjach
od 2 do n. Kart z wierzchu talii bdziemy trzyma osobno. Zauwamy, e nigdy nie bdziemy
ingerowa w elementy od 3 do n, jedynie zdejmowa elementy z gry i wrzuca na koniec kolejki.
W wyniku operacji A:
element pierwszy staje si ostatnim i zostaje dodany na koniec kolejki,
element drugi staje si pierwszym, zatem opuszcza kolejk.
W wyniku operacji B:
element drugi staje si ostatnim, zatem zostaje zdjty z pocztku kolejki i dodany na koniec.
96
ROZDZIA 6. ROZWIZANIA
6.5
Dzie czwarty
Opracowanie: Las
Dostpna pami: 64 MB
Dzie 4, 23.09.2010
Las
Rozwizanie brutalne
Rozwizanie brutalne ma zoono O(n4 ). Naley zauway, e jedno z drzew na planszy
musi by najstarsze. Dla kadego drzewa zakadamy, e jest ono najstarsze i wykonujemy przeszukiwanie grafu wszerz (BFS) po drzewach o takim samym wieku bd modszych. Z wszystkich takich drzew, z ktrych da si zbudowa dom o wielkoci poszukiwanej przez pana Jana,
wybieramy najmodsze.
Rozwizanie wzorcowe
Rozwizanie wzorcowe ma zoono O(n2 log n2 ). Rozwizanie opiera si na zbiorach rozcznych. W rozwizaniu idziemy po drzewach zaczynajc od najmodszych i idc w gr wiekiem (tworzymy wektor par (wysoko drzewa, pozycja drzewa), a nastpnie go sortujemy).
Dla kadego z nich sprawdzamy kolejno wszystkie pola ssiednie (x 1, y), (x + 1, y), (x, y
1), (x, y+1), czy ktrekolwiek ma nie wikszy wiek ni pole (x, y). Jeli tak, to czymy odpowiadajce im zbiory rozczne (oraz dodajemy do siebie ich wielkoci). Jeli w ktrym momencie
wielko zbioru rozcznego przekroczy (lub dorwna) rozmiar domu pana Jana, to wypisujemy
wiek aktualnego drzewa, gdy wtedy najstarsze wycite drzewo bdzie miao taki wiek (zawsze
dla danego wieku drzewa wiemy jak najwikszy dom moemy zbudowa tak, e dane drzewo
jest najstarsze).
97
ROZDZIA 6. ROZWIZANIA
Opracowanie: Domino
Dostpna pami: 32 MB
Dzie 4, 23.09.2010
Domino
Oglne spostrzeenia
Spjrzmy na zadanie troch z innej perspektywy. Przewrmy wszystkie klocki domina i potraktujmy je po przewrceniu jak przedziay na osi liczbowej. Klocek znajdujcy si w odlegoci
d od klocka pierwszego majcy wysoko h bdzie reprezentowany przez przedzia [d, d + h].
Naszym zadaniem jest teraz znale najwikszy zbir przedziaw, po usuniciu ktrych
suma pozostaych przedziaw bdzie spjnym przedziaem, inaczej mwic kolejne przedziay
parami bd miay niepust cz wspln.
Na pocztku obliczmy tablic D[i] - pocztek i-tego przedziau oznaczajcy odlego i-tego
klocka od klocka pierwszego, oraz K[i] - koniec i-tego przedziau.
1
2
3
f o r i := 1 to n do
D[ i ] := D[ i 1] + x [ i 1]
K[ i ] := D[ i ] + h [ i ]
Rozwizanie wykadnicze
Zastanwmy si nad jakimkolwiek poprawnym rozwizaniem naszego zadania. Najprostszym pomysem jest przeszukanie przestrzeni wszystkich moliwych rozwiza. Przegldamy
wic wszystkie podzbiory klockw, zakadamy, e wanie te klocki zostan usunite i sprawdzamy, czy pozostae klocki speniaj odpowiednie warunki. Spord wszystkich poprawnych
podzbiorw wybieramy ten o najwikszej liczbie elementw. Takie rozwizanie dziaa w zoonoci O(n2n ) i dostawao 20 punktw.
Programowanie dynamiczne
Sprbujmy podej do tego zadania za pomoc programowania dynamicznego. Przez poczenie midzy przedziaem x i przedziaem y bdziemy rozumie cig przedziaw, ktre
kolejno zachodz na siebie(tj. ich przecicie jest niepuste), pierwszym elementem tego cigu jest
x, a ostatnim y.
We wszystkich rozwizaniach zamiast szuka najwikszego zbioru przedziaw, ktry mamy
usun, bdziemy szuka najmniejszego zbioru przedziaw, ktry jest poczeniem midzy
przedziaem 1 i n.
Dla kadego przedziau i bdziemy oblicza warto dp[i], ktra oznacza minimaln dugo
poczenia midzy przedziaem 1 i przedziaem i. Wartoci dp[i] moemy policzy nastpujco.
dp[i] = minj<i,K[j]>D[i] dp[j] + 1.
Inaczej mwic, sprawdzamy wszystkie przedziay, ktre zachodz na przedzia i z lewej
strony tj. takie, ktre rozpoczynaj si PRZED pocztkiem przedziau i-tego, a kocz ZA
pocztkiem przedziau i-tego. Niech j bdzie jednym z takich przedziaw. Dugo najkrtszego
poczenia midzy przedziaami 1 i j to dp[j]. Z kolei poczenie midzy 1 a i moe by
zrealizowane jako poczenie 1 z j, a nastpnie j z i - w ten sposb poczenie ma dugo
dp[j] + 1. dp[i] jest rwne minimalnej spord tych wartoci dla wszystkich j.
98
ROZDZIA 6. ROZWIZANIA
Rozwizanie to dziaa w zoonoci O(n2 ). Takie rozwizanie dostawao 40 punktw. Pseudokod tego rozwizania mgby wyglda nastpujco:
1
2
3
4
5
6
f o r i :=
dp [ i ]
for j
if
1 to n do
:= INF
:= 1 to i 1 do
K[ j ] > D[ i ] and dp [ j ]+1 > dp [ i ] then
dp [ i ] := dp [ j ] + 1
wypisz ( n dp [ n ] )
Rozwizanie wzorcowe
Zamy, e wybieramy po kolei kolejne klocki, ktre maj upa. Niech ostatnim klockiem,
ktry do tej pory wybralimy, bdzie i. Chcemy teraz wybra nastpny klocek j. Zastanwmy
si, jaki klocek opaca si wybra.
A no taki, ktrego przedzia zachodzi na przedzia i z prawej strony i koniec tego przedziau
jest moliwie najdalej. Czyli zachodz warunki j > i oraz D[j] < K[i] oraz K[j] jest moliwie
najwiksze. Dlaczego?
Dowd.
Zamy przeciwnie, e istnieje rozwizanie, w ktrym otrzymamy lepszy wynik ni w wyej opisanym. Poniewa nie wybieralimy wg powyszego schematu, wic istnieje przedzia j,
po ktrym wybralimy przedzia k, a najdalej koczcym si przedziaem zachodzcym z prawej na j jest l. Zamiemy teraz w tym rozwizaniu klocek k na l. Zmienione rozwizanie jest tak
samo dobre jak poprzednie i rwnie jest poprawne. Std wniosek, e postpujc wg powyszego
schematu otrzymujemy najlepsze rozwizanie.
Pseudokod rozwizania dziaajcego wg powyszego schematu mgby wyglda nastpujco:
1
2
3
4
5
6
7
8
9
10
11
12
l a s t := 1
wynik := 2
while K[ l a s t ] <= D[ n ] do
next := l a s t + 1
j := l a s t + 1
while K[ l a s t ] > D[ j ] do
i f K[ j ] > K[ next ] then
next := j
j := j + 1
l a s t := next
wynik := wynik + 1
wypisz ( n wynik )
Zauwamy, e jeli dla pewnego last przejrzymy wszystkie j, dla ktrych j > last, D[j] < K[last]
i najdalej koczy si przedzia next, to w kolejnej iteracji ptli nie ma tak naprawd potrzeby
99
ROZDZIA 6. ROZWIZANIA
przeglda takich przedziaw, ktrych pocztek jest w przedziale [D[next], K[last]], poniewa
te przedziay w caoci zawieraj si w przedziale next i z tego powodu nie mog nam poprawi
rozwizania. Jednak kade takie j zostanie przejrzane co najwyej 2 razy, dlatego zoono
powyszego algorytmu jest liniowa. Dlaczego? Niech l, l0 , l00 bd trzema kolejno wybranymi
przez nasz algorytm przedziaami. Czyli D[l00 ] > D[l0 ] oraz D[l00 ] < K[l0 ]. Zauwamy, e musi
zachodzi warunek D[l00 ] > K[l]. Gdyby tak nie byo, to najdalej koczcym si przedziaem,
ktry zachodzi na l, byoby l00 a nie l0 . Zatem wszystkie przedziay, ktrych pocztek jest midzy
D[l0 ], a K[l], zostan przejrzane tylko przy obiegu ptli, dla l i l0 . Algorytm ten ma zoono
O(n).
100
ROZDZIA 6. ROZWIZANIA
Opracowanie: Suma
Dostpna pami: 32 MB
Dzie 4, 23.09.2010
Suma
Rozwizanie wzorcowe
Zauwamy, e suma z treci zadania jest rwnowana sumie liczb od 1 do 2k 1. Wzr
na sum liczb od 1 do n wynosi n(n+1)
. Podstawiajc do tego wzoru 2k 1 otrzymujemy
2
(2k 1)(2k )
2
wczytaj ( k )
f o r i := 1 to k do
wypisz ( 1 )
f o r i := 1 to k 1 do
wypisz ( 0 )
101
6.6
ROZDZIA 6. ROZWIZANIA
Dzie pity
Opracowanie: Wykres
Dostpna pami: 32 MB
Dzie 5, 24.09.2010
Wykres
Rozwizanie wzorcowe
Problem przedstawiony w zadaniu jest problemem najduszego podcigu rosncego. Iterujc
po kolejnych wynikach Adiego bdziemy zapamitywa, jakie pocigi ju wystpiy i w miar
moliwoci dodawa nowe podcigi. Zauwamy, e wystarcz nam informacje, czy wystpiy
podcigi 0, 1 i 01.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
wczytaj (n , t [ ] )
b y l o 0 := b y l o 1 := b y l o 0 1 := 0
wynik := 1
f o r i := 1 to n do
i f t [ i ] == 0 then
b y l o 0 := 1
i f t [ i ] == 1 then
b y l o 1 := 1
i f b y l o 0 == 1 then
b y l o 0 1 := 1
wynik := max( wynik , 2 )
i f t [ i ] == 2 then
i f b y l o 0 1 == 1 then
wynik := max( wynik , 3 )
i f b y l o 0 == 1 or b y l o 1 == 1 then
wynik := max( wynik , 2 )
wypisz ( wynik )
102
ROZDZIA 6. ROZWIZANIA
Opracowanie: Turniej
Dzie 5, 24.09.2010
Turniej
Rozwizanie wzorcowe
Zauwamy, e jeli liczba zawodnikw jest mniejsza ni wielko grupy, to wszyscy automatycznie wygrywaj.
Od tej pory zajmowa si bdziemy tylko przypadkiem, gdy liczba zawodnikw jest nie
mniejsza od wielkoci grupy. Wtedy zwycizc jakkolwiek przeprowadzonego turnieju moe
zosta dokadnie k 1 najlepszych zawodnikw (gdzie k to liczba osb, na ktre dzielone s
grupy). Zatem wynikiem dla kadego testu jest min(n, k 1)
Wyjanienie rozwizania
Pierwsz obserwacj jest to, e nie moe by wicej zwycizcw dowolnie przeprowadzonego turnieju ni k 1 zawodnikw, gdy wtedy turniej odbywa si dopki zawodnikw mona
podzieli na co najmniej jedn grup k osobow.
Mniej ni k 1 zawodnikw nie moe zosta zwycizcami dowolnie przeprowadzonego turnieju,
n gdy w kadej turze, jeli mamy n zawodnikw, moe zosta wyeleminowanych co najwyej
k zawodnikw, zatem od chwili gdy n < 2 k eliminowany jest w kadej turze jeden zawodnik.
Teraz pokaemy, e dowolnie przeprowadzony turniej zawsze wygrywa k 1 najlepszych
zawodnikw. Istotnie przypumy, e ktry z k 1 najlepszych zawodnikw nie naley do zwycizcw. Wtedy, aby zosta wyeleminowanym, musiaaby istnie grupa skadajca si z k zawodnikw, w ktrej by on najsabszy. Niestety nie jest to moliwe, gdy musiaoby istnie k 1
lepszych od niego zawodnikw. Jest to niemoliwe, gdy siy wszystkich zawodnikw s rne,
a od danego zawodnika istnieje co najwyej k 2 lepszych zawodnikw.
103
ROZDZIA 6. ROZWIZANIA
Opracowanie: Przyjcie
Dostpna pami: 32 MB
Dzie 5, 24.09.2010
Przyjcie
Wstp
Z warunkw zadania atwo moemy zauway, e aby Kasia moga sprbowa cukierka jakiego rodzaju, to liczba tych cukierkw nie moe by podzielna przez liczb goci. A wic, naszym
zadaniem jest znalezienie najmniejszej liczby dodatniej, ktra nie dzieli adnej spord n podanych nam liczb.
Rozwizanie brutalne
Zauwamy, e najwiksza liczba, jaka moe by odpowiedzi, to 105 + 1, poniewa cukierkw
kadego rodzaju moe by co najwyej 105 , a przy 105 + 1 nikt z goci nie dostanie adnego
cukierka i wszystkie trafi do Kasi.
Moemy wic wczyta do tablicy wszystkie liczby zawierajce ile jest cukierkw danego
rodzaju i sprawdzi po kolei wszystkie liczby od 1 do 105 + 1, czy adna z liczb w tablicy nie
jest podzielna przez sprawdzan liczb.
1
2
3
4
5
6
7
8
9
10
11
wczytaj (n)
f o r i := 0 to n1 do
w c z y t a j tab [ i ]
f o r i := 1 to 105+1 do
p o d z i e l n a := f a l s e
f o r j := 0 to n1 do
i f tab [ j ] mod i == 0 then
p o d z i e l n a := true
i f p o d z i e l n a == f a l s e then
wypisz ( i )
zakoncz program ( )
Takie rozwizanie, w najgorszym przypadku, wymaga 105 106 operacji, czyli 1011 , co niestety
jest za wolne.
Rozwizanie wolne
Zauwamy dwie rzeczy:
1. Jeli jest tyle samo cukierkw dwch rnych rodzajw, to nie zmieniaby nam si sytuacja,
jeli jeden z tych rodzajw bymy cakowicie odrzucili.
2. Wszystkich cukierkw moe by 106 , a wszystkich moliwych liczb cukierkw w kadym
rodzaju jest 105 , a zatem przy 106 cukierkw mamy na pewno powtrki, po eliminacji
ktrych liczba rnych rodzajw wynosiaby 105 .
Std, po odrzuceniu duplikatw, w tablicy mielibymy maksymalnie 105 105 = 1010 oblicze
co jednak wci jest za wolne.
104
ROZDZIA 6. ROZWIZANIA
Rozwizanie wzorcowe
Z poprzedniego punktu wiemy, e nie musimy trzyma informacji o tym, ile jest cukierkw
danego rodzaju, a tylko informacj o tym, czy istnieje rodzaj, w ktrym wystpuje k cukierkw.
Dane moemy reprezentowa jako boolowska tablica z indeksami od 1 do 105 , w ktrej to jest
false jeli indeks w tablicy jest liczb, ktra nie jest iloci cukierkw adnego rodzaju, a true
w przeciwnej sytuacji.
Tak tablic moemy wczyta w nastpujcy sposb.
1
2
3
4
5
tab [ ] := { f a l s e }
wczytaj (n)
f o r i := 0 to n1
wczytaj ( j )
tab [ j ] := true
Nastpnie, tak jak ostatnio, sprawdzamy wszystkie liczby od 1 do 105 + 1, czy speniaj warunki
zadania, z tym e, aby sprawdzi czy dana liczba dzieli jak z wczytanych liczb, wystarczy
sprawdzi w naszej tablicy, czy w indeksach bdcych wielokrotnociami danej liczby wystpuje
warto true.
1
2
3
4
5
6
7
8
9
10
f o r i := 1 to 105+1 do
d z i e l i := f a l s e
c := i
while c < 105 do
i f tab [ c ] = true then
d z i e l i := true
c := c + i
i f d z i e l i == f a l s e then
wypisz ( i )
zakoncz program ( )
atwo zauway, e sprawdzajc coraz wiksze liczby, musimy w tablicy dokona coraz mniej
sprawdze (dla 1 musimy sprawdzi w 105 miejscach, dla 2 w 105 /2, ale ju dla 10 w 104
miejscach, natomiast 1000 wymaga juz tylko 100 sprawdze, co w sumie daje nam nieco ponad
milion sprawdze, co jest ju wystarczajco szybkie).
105
Rozdzia 7
Wykady
7.1
Teoria liczb I
7.1.1
Wstp
7.1.2
Aby sprawdzi, czy liczba n wiksza od 1 jest pierwsza, przegldamy wszystkie liczby cakowite
wiksze od 1 i mniejsze od n. Jeeli ktrakolwiek z tych liczb dzieli n, to n jest liczb zoon.
W przeciwnym wypadku n jest liczb pierwsz. Zoono tego algorytmu to O(n).
W bardzo prosty sposb moemy przyspieszy powyszy algorytm. Wystarczy zauway,
e liczb n moemy uzna za pierwsz, jeeli nie posiada dzielnikw mniejszych rwnych od
z tych dwch dzielnikw jest wic mniejszy lub rwny n. Gdyby tak nie byo, to n musiaoby
wszystkie liczby od 2 do n, jeeli znajdziemy liczb, ktra dzieli n, to n jest zoona. W prze
ciwnym wypadku n jest pierwsza. Zoono tego algorytmu to O( n). Sprbujmy to zapisa.
1
2
3
4
5
6
7
8
106
ROZDZIA 7. WYKADY
Warunek i i <= n w tym przypadku jest rwnowany i <= sqrt(n), jednak dziki zastosowanej formie nie wystpuje konieczno konwersji typw i wchodzenia w liczby zmiennoprzecinkowe.
7.1.3
Sito Eratostenesa
Sito Eratostenesa jest znanym algorytmem znajdowania wszystkich liczb pierwszych z przedziau
[2, n]. Nazwa pochodzi od tego, e wszystkie liczby s po kolei przesiewane i usuwane s wszystkie wielokrotnoci danej liczby. eby wszystko stao si janiejsze, przejdmy do przykadu.
W pierwszym kroku[b] wybieramy najmniejsz liczb, ktra nie zostaa wykrelona, czyli 2,
i wykrelamy wszystkie jej wielokrotnoci mniejsze od n. W nastpnych krokach powtarzamy
to samo dla kolejnych niewykrelonych liczb, czyli kolejno 3[c] i 5[d]. Jak zauwaylimy przy po
przednim algorytmie, kada liczba zoona ma dzielnik mniejszy lub rwny n. W szczeglno
ma te taki dzielnik pierwszy. W zwizku z tym, wystarczy wykreli wielokrotnoci tylko tych
liczb pierwszych, ktre s mniejsze lub rwne n. Wwczas kada liczba zoona z przedziau
[2, n] zostanie wykrelona.
[a]
10
11 12 13 14 15 16 17 18
19 20 21 22 23 24 25 26
27 28 29 30
[b]
10
11 12 13 14 15 16 17 18
19 20 21 22 23 24 25 26
27 28 29 30
[c]
10
11 12 13 14 15 16 17 18
19 20 21 22 23 24 25 26
27 28 29 30
[d]
10
11 12 13 14 15 16 17 18
19 20 21 22 23 24 25 26
27 28 29 30
[e]
10
11 12 13 14 15 16 17 18
19 20 21 22 23 24 25 26
27 28 29 30
Algorytm ten moemy jeszcze nieznacznie przyspieszy zauwaajc, e nie musimy wykrela
wielokrotnoci liczby i, ktre s mniejsze od i2 . Wielokrotnoci takie maj posta k i, k < i,
i zostay ju skrelone dla jednego z dzielnikw pierwszych k.
Po tej poprawce trzecia linijka mogaby wyglda tak:
1
Zastanwmy si, jaka jest zoono sita. Przy obliczaniu liczby operacji nie bdziemy
uwzgldnia ostatniej poprawki, gdy nie wpywa ona na asymptotyczn zoono. Dla kadej
pP,p6 n
pP,p6n
Dowd na to, e suma odwrotnoci liczb pierwszych mniejszych od n jest rwna asymptotycznie
O(lnln n), zostawmy matematykom, a po prostu zawierzmy Eulerowi, ktry to udowodni.
Dziki sicie Eratostenesa moemy w prosty sposb znale wszystkie liczby pierwsze mniejsze
od n, ale sito moe si okaza duo bardziej przydatne, jeeli je lekko zmodyfikujemy. Dla kadej
wykrelanej liczby bdziemy dodatkowo zapisywa informacj o dzielniku pierwszym, ktry j
dzieli.
107
ROZDZIA 7. WYKADY
1
2
3
4
3
0
4
2
5
0
6
2
7
0
8
2
9
3
10
2
11
0
12
3
13
0
14
2
15
3
16
2
17
0
18
3
19
0
20
2
21
3
22
2
23
0
24
3
Dziki takiemu podejciu moemy bardzo szybko rozkada liczby na czynniki pierwsze.
Jeeli wiemy, e liczba x ma dzielnik pierwszy p, to jej rozkadem na czynniki pierwsze jest
rozkad liczby xp oraz dzielnik p.
1
2
3
4
5
6
int i=x ;
while ( d z i e l n i k P [ i ] >0) {
p r i n t f ( %d , d z i e l n i k P [ i ] ) ;
i /= d z i e l n i k P [ i ] ;
}
p r i n t f ( %d , i ) ;
Liczba x nie moe mie wicej ni O(lg x) czynnikw pierwszych. Dlaczego? Przy kadym
kroku algorytmu zmniejszamy liczb i co najmniej dwa razy i dodajemy jeden dzielnik pierwszy.
W zwizku z tym po co najwyej lg x 1 obrotach ptli i zmaleje do liczby pierwszej i algorytm
si zakoczy. Faktoryzacja liczby x t metod ma zoono czasow O(lg x). Warto zauway,
e kolejne otrzymywane czynniki przy tej metodzie nie s uporzdkowane. Przykadowo rozkadajc liczb 18 otrzymujemy 3 2 3. Problem ten moemy rozwiza dwojako. Albo na kocu
sortujemy otrzymane czynniki, albo stosujemy sito Eratostenesa bez ulepsze, ktre wymusza
kolejno czynnikw.
7.1.4
25
5
ROZDZIA 7. WYKADY
7.1.5
Algorytm Euklidesa
Algorytm Euklidesa jest chyba najbardziej znanym algorytmem. Za jego pomoc moemy szybko
znale najwikszy wsplny dzielnik dwch liczb cakowitych a i b. Opiera si on na dwch
faktach. Po pierwsze,
jeeli b|a, to N W D(a, b) = b.
Tego raczej nie trzeba wyjania. Po drugie,
przedstawmy a jako a = bt + r, dla cakowitych t i r. Wwczas N W D(a, b) =
N W D(b, r).
Dlaczego? N W D(a, b) = N W D(bt+r, b). Niech d = N W D(a, b), wtedy d|bt+r d|b = d|r.
Std N W D(a, b)|N W D(b, r). Poka teraz, e N W D(b, r)|N W D(a, b). Niech c = N W D(b, r).
c|b c|r = c|b t + r, czyli c|a. Std c|N W D(a, b). Skoro N W D(a, b)|N W D(b, r) oraz
N W D(b, r)|N W D(a, b), to N W D(a, b) = N W D(b, r).
Pokazalimy wasno rekurencyjn algorytmu Euklidesa, ktra pozwoli nam szybko policzy wynik. Bdziemy rekurencyjnie wywoywa algorytm, dopki a nie jest podzielne przez
b. Zauwamy, e w kadych dwch krokach algorytmu co najmniej jedna z liczb zmniejszy si
co najmniej o poow. W zwizku z tym zoono algorytmu jest logarytmiczna ze wzgldu
na wielko liczb a i b. Przykadowa implementacja:
1
2
3
4
7.1.6
Faktoryzacja n!
Rozwaanie duych liczb postaci n! i wykonywanie na nich operacji czsto jest moliwe jedynie
posugujc si ich rozkadem na czynniki pierwsze. Takie liczby mog osiga rozmiary milionw
cyfr, a ich rozkad na czynniki pierwsze pozostanie w akceptowalnym rozmiarze, poniewa jego
109
ROZDZIA 7. WYKADY
wielko jest w logarytmicznym stosunku do wielkoci liczby. Tak wic, zajmiemy si szybk
faktoryzacj liczby postaci n!.
Chcemy szybko umie odpowiedzie na pytanie, ile razy w rozkadzie na czynniki pierwsze
liczby n! wystpi liczba pierwsza p. Przyjrzyjmy si przykadowi.
4
3
3
2
2
1
1
0
1
0
3
0
5
0
7
0
9
10
0
0
11 12 13
0
14 15
16
Policzenie liczby wszystkich dwjek w rozkadzie na czynniki pierwsze liczby 16! to inaczej
suma wysokoci wszystkich supkw na powyszym wykresie.
My jednak podejdziemy do tego problemu z nieco innej strony. Sum wysokoci wszystkich
supkw moemy rwnie przedstawi jako: liczba supkw o wysokoci co najmniej 4 + liczba
supkw o wysokoci co najmniej 3 + liczba supkw o wysokoci co najmniej 2 + liczba supkw
o wysokoci co najmniej 1. Czyli tak jakby zliczamy wysokoci supkw warstwami.
To podejcie w tym przypadku jest dobre, gdy w prosty sposb moemy zliczy liczb
supkw wyszych od pewnej wysokoci. Zauwamy, e liczba supkw o wysokoci co najmniej
d to inaczej ilo liczb podzielnych przez pd . A ile jest takich liczb moemy policzy jako b pnd c,
w tym przypadku b 216d c. Suma wysokoci wszystkich supkw to zatem:
b
n
n
n
c + b 2 c + ... + b d c
1
p
p
p
(7.2)
16
16
16
16
c + b c + b c + b c = 8 + 4 + 2 + 1 = 15
2
4
8
16
(7.3)
110
ROZDZIA 7. WYKADY
7.2
Algorytmy rwnolege
7.2.1
Wstp
7.2.2
Model oblicze
p1
p2
p3
...
pn
wsplna pami
Kady procesor moe w jednej jednostce czasu odwoa si do wsplnej pamici.
7.2.3
ROZDZIA 7. WYKADY
7.2.4
Przykady zada
wynik := f a l s e
f o r i := 1 to n in p a r a l l e l do
i f A[ i ] = 1 then wynik := true ;
for i
if
for i
if
:= 1
i <>
:= 1
M[ i ]
to n , j := 1 to n in p a r a l l e l do
j and A[ i ] <= A[ j ] then M[ j ] := 1
to n in p a r a l l e l do
= 0 then wynik := i
for i
if
for i
if
:= 1
A[ i ]
:= 1
A[ i ]
to n , j := i + 1 to n in p a r a l l e l do
= 1 and A[ j ] = 1 then A[ j ] := 0
to n in p a r a l l e l do
= 1 then wynik := i
112
ROZDZIA 7. WYKADY
p := n/2
while p > 0 do
f o r i := 1 to p in p a r a l l e l do
A[ i ] := A[ i ] + A[ i+p ]
p := p/2
wynik := A [ 1 ]
7.2.5
Przeskakiwanie
Metoda przeskakiwania bdzie pozwalaa na tworzenie szybkich algorytmw rwnolegych dla list
(operujemy na wskanikach).
Aby rwnolegle operowa na obiektach listy, wygodnie jest zwiza z kadym obiektem odpowiedzialny za ten obiekt procesor.
Porzdek na licie
Dane: n elementowa lista L czyli dla kadego obiektu i znamy warto next[i], oznaczajc
nastpny obiekt na licie, ostatni element ma next[i] = N IL
Szukane: chcemy policzy warto d[i], oznaczajc odlego i-tego obiektu od koca listy.
Ostatni element powinien mie d[i] = 0, przedostatni d[i] = 1 itd.
Maszyna: EREW
Istnieje proste rozwizanie o zoonoci O(n) n razy przekazujemy odlego w ty poczynajc od koca listy.
113
ROZDZIA 7. WYKADY
f o r kazdy p r o c e s o r i in p a r a l l e l do
i f next [ i ] = NIL then d [ i ] := 0
e l s e next [ i ] := 1
while i s t n i e j e o b i e k t i , t a k i g d z i e next [ i ] <> NIL do
f o r kazdy p r o c e s o r i in p a r a l l e l do
i f next [ i ] <> NIL then
d [ i ] := d [ i ] + d [ next [ i ]
next [ i ] := next [ next [ i ] ]
[a]
[b]
[c]
[d]
Dlaczego poprawne?
Dla kadego obiektu i w kadej iteracji ptli z linijki 4. suma wartoci d w podlicie o pocztku
w i jest rwna odlegoci obiektu i od koca listy L.
Dlaczego czas logarytmiczny?
Zauwamy, e w kadym obiegu ptli w linijce 4. liczba list zwiksza si dwukrotnie (powstaje
lista skadajca si z obiektw o pozycjach parzystych oraz lista z pozycjami nieparzystymi),
natomiast dugoci tych list zmniejszaj si o poow. W zwizku z tym po log n krokach
pozostanie n list dugoci 1.
7.2.6
114
ROZDZIA 7. WYKADY
1
2
3
4
5
6
7
f o r kazdy p r o c e s o r i in p a r a l l e l do
s [ i ] := a [ i ]
while i s t n i e j e o b i e k t i , t a k i g d z i e next [ i ] <> NIL do
f o r kazdy p r o c e s o r i in p a r a l l e l do
i f next [ i ] <> NIL then
s [ next [ i ] ] := d [ i ] + d [ next [ i ]
next [ i ] := next [ next [ i ] ]
f o r kazdy p r o c e s o r i in p a r a l l e l do
i f o j c i e c [ i ] = NIL then
k o r z e n := i
7.2.7
Zadania
1. Dla danej n-elementowej listy, ktrej niektre elementy s biae a niektre czarne, naley
podzieli j na dwie listy (tylko biae i tylko czarne). Naley zachowa kolejno elementw
na licie. Maszyna EREW.
2. Sprawdzi, czy cig nawiasowy dugoci n skadajcy si z nawiasw ( i ) jest poprawny.
Maszyna EREW.
3. Znalezienie korzenia dla kadego wierzchoka w lesie drzew skadajcym si z n wierzchokw. Maszyna CREW.
115
7.3
7.3.1
ROZDZIA 7. WYKADY
Wstp do wskanikw
int p ;
int abc ;
int p = &abc ;
int abc ;
int p = &abc ;
p = 3 ;
Teraz abc = (3, 0). Jeli wskanik wskazuje na zoon struktur to moemy od razu dosta si
do ktrego z atrybutw uywajc operatora >.
Oczywicie moglibymy napisa:
1
2
3
Ale przy wikszych strukturach musielibymy dostawia duo nawiasw, co moe by niewygodne.
Kolejn istotn rzecz jest to, e nazwa tablicy jest w istocie wskanikiem na jej pierwszy element. Poniszy kod powinien rozwia cz wtpliwoci:
1
2
3
4
5
6
7
int t [ 1 0 ] ;
int main ( ) {
int p = t ;
int q = &t [ 0 ] ;
i f ( p == q )
c o u t << Ale urwal << e n d l ;
}
ROZDZIA 7. WYKADY
Ostatni interesujc rzecz jest to, e jeli dodamy do wskanika warto x (typu int), to wskanik bdzie wskazywa na warto, ktry znajduje si x blokw dalej w pamici. Jest to bardzo uyteczne przy tablicach: Jeli nazwa tablicy wskazuje na 0-wy element tablicy, to nazwa
tablicy+x wskazuje na x-owy element tablicy. Moe to by take wykorzystywane do odejmowania dwch iteratorw od siebie, aby zobaczy, ile blokw pamici jest pomidzy nimi.
7.3.2
Iterator
Wikszo kontenerw w C++ posiada iterator typ, ktry suy na wskazywanie pojedynczych
elementw danego kontenera (i chodzenia po ssiednich elementach). Iterator posiada bardzo
wiele analogii do dziaania wskanikw i w wielu miejscach moemy uywa obu zamiennie.
Moemy zauway analogi do wskanikw, gdzie wskanik wskazuje na pojedynczy blok pamici, iterator wskazuje na pojedynczy element kontenera (oczywicie wskanik i iterator mog
wskazywa na to samo).
vector<int>::iterator it;
// deklaracja iteratora
Czyli oglniej (typkontenera) :: iterator Tak stworzony iterator nie wskazuje na nic sensownego, wiemy tylko, e moe wskazywa na elementy vectora zoonego z intw. Jeli chcemy,
aby wskazywa na konkretny element, moemy to zrobi w nastpujcy sposb:
1
2
3
4
v e c t o r <int> V;
v e c t o r <int > : : i t e r a t o r i t 1 , i t 2 ;
i t 1 = V. b e g i n ( ) ;
i t 2 = V. end ( ) ;
Wszystkie kontenery, dla ktrych moemy stworzy iterator, posiadaj przypisane sobie dwa
specjalne iteratory begin i end. Begin wskazuje na pierwszy element kontenera, end wskazuje
na pierwszy fragment pamici za kocem kontenera. Taka nietypowa warto end jest spowodowana tym, e gdyby end wskazywa na ostatni element, to bardzo niewygodnym byoby przejcie
caego kontenera za pomoc iteratorw. Dziki takim wartociom begin i end przejcie caego
vectora moe by wykonane bardzo prost ptl:
1
2
3
4
5
6
7
8
v e c t o r <int> V;
f o r ( int i =0; i <5; i ++)
V. push back ( i ) ;
v e c t o r <int > : : i t e r a t o r i t ;
f o r ( i t = V. b e g i n ( ) ; i t !=V. end ( ) ; i t ++) {
c o u t << i t << ;
}
c o u t << e n d l ;
i f ( i t == 2 ) V. e r a s e ( i t ) ;
to otrzymamy wynik:
0 1 3 4
Uwaga: nie naley uywa powyszej operacji do kasowania wicej ni staej liczby elementw
z vectora, gdy vector realizuje usunicie w taki sposb, e kasuje dany element i przesuwa
wszystkie pozostae w lewo, wic zoono tej operacji to O(n).
117
7.3.3
ROZDZIA 7. WYKADY
W poprzednim wykadzie byy tylko algorytmy, ktre nie wymagaj adnej wiedzy o vectorach
i wskanikach, ale i tak niewiadomie wykorzystywalimy wskaniki i iteratory. Przypomnijmy
sobie, jak korzystalimy z funkcji sort:
1
2
s o r t (V. b e g i n ( ) , V. end ( ) ) ;
s o r t ( t , t+WIELKOSC T ) ;
\\ t t o nazwa t a b l i c y T [ WIELKOSC T ] ;
Widzimy teraz, e argumenty, ktre podalimy funkcji sort, byy to w rzeczywistoci iteratory
bd wskaniki wskazujce pocztek pamici, bd jeden element za kocem pamici, ktr
chcielimy posortowa.
STL dostarcza bardzo duo algorytmw, ale wikszo z nich moe by zastpiona jedn prost
ptl. Mona je znale na stronie dokumentacji (punkt 5 - Algorithms):
http://www.sgi.com/tech/stl/table_of_contents.html
Na tym wykadzie omwimy tylko te, ktre s warte pamitania.
Najpierw wemy dwie funkcje typowe dla vectorw insert i erase. Stosujemy je w nastpujcy
sposb:
V.insert(it, x);
// wstawia element x przed miejsce, na ktre wskazuje iterator it
V.erase(it);
// usuwa element, na ktry wskazuje iterator it
V.erase(it1, it2); // usuwa elementy z przedziau [it1, it2)
Oba algorytmy dziaaj w czasie O(n).
Wemy teraz dwa przydatne algorytmy lower bound i upper bound. S to STL-owe implementacje wyszukiwania binarnego czyli algorytmu, ktry potrafi w posortowanej tablicy znale
dany element w czasie O(log n) gdzie n to dugo tablicy. Przykad uycia:
1
2
Lower bound znajduje nam iterator (bd wskanik) w tablicy pierwszego elementu, ktry jest
wikszy bd rwny x. Upper bound znajdzie nam indeks pierwszego wikszego elementu od y.
Wicej bdzie wida na przykadzie:
Jeli x = 2, y = 3, V = (1, 2, 2, 3, 3, 4, 5) to lower bound(x) wskae pierwsz 2 (na indeksie 1),
a upper bound(y) wskae 4 (na indeksie 5). Okazuje si, e dziki temu moemy bardzo atwo
policzy, ile jest liczb na przedziale [x, y]. Bdzie to:
1
Odejmujemy tutaj od siebie dwa iteratory, a przy sekcji z iteratorami nie powiedzielimy, e jest
to moliwe (powiedzielimy tylko, e jest to moliwe dla wskanikw). Spowodowane byo to tym,
e nie wszystkie iteratory mona od siebie odejmowa. Moemy od siebie odejmowa iteratory
tylko tych kontenerw, ktre s zaimplementowane na cigej pamici. Na tym wykadzie jedynym kontenerem speniajcym te warunki jest vector (drugim istotnym jest deque). Przy pomocy powyszej wasnoci mona atwo zapamita, jak dziaaj oba algorytmy, wystarczy tak
dobra iteraratory, aby ich rnica dawaa ile jest liczb na danym przedziale.
Dosy uytecznym algorytmem, mimo e atwo implementowanym samemu, jest unique. Jeli mamy posortowany vector V, to z uyciem unique moemy usun powtrzenia w tym vectorze. Wemy przykad uycia:
118
ROZDZIA 7. WYKADY
1
2
3
4
5
v e c t o r <int> v ;
.....
s o r t ( v . b e g i n ( ) , v . end ( ) ) ;
v e c t o r <int > : : i t e r a t o r i t = unique ( v . b e g i n ( ) , v . end ( ) ) ;
v . e r a s e ( i t , v . end ( ) ) ;
Po powyszym kodzie vector v jest posortowanym vectorem bez powtrze. Po uyciu unique
vector jest zmieniony w taki sposb, e od v.begin() do it 1 posiadamy wersj vectora v
bez powtrze (gdzie it iterator zwracany przez unique). Chcemy si pozby tej ostatniej
czci vectora, wic usuwamy przedzia [it, v.end()]. Poniszy kod powinien rozjani powysze:
1 #include <i o s t r e a m >
2 #include <v e c t o r >
3 #include <a l g o r i t h m >
4 using namespace s t d ;
5 void wypisz ( v e c t o r <int> v ) {
6
f o r ( int i =0; i <v . s i z e ( ) ; i ++)
7
c o u t << v [ i ] << ;
8
c o u t << e n d l ;
9 }
10 int main ( ) {
11
v e c t o r <int> v ;
12
f o r ( int i =0; i <9; i ++)
13
v . push back ( rand ( ) % 8 ) ;
14
wypisz ( v ) ;
15
s o r t ( v . b e g i n ( ) , v . end ( ) ) ;
16
wypisz ( v ) ;
17
v e c t o r <int > : : i t e r a t o r i t = unique ( v . b e g i n ( ) , v . end ( ) ) ;
18
wypisz ( v ) ;
19
v . e r a s e ( i t , v . end ( ) ) ;
20
wypisz ( v ) ;
21
return 0 ;
22 }
Przykadowy wynik:
7
1
1
1
6
1
2
2
1
1
3
3
7.3.4
3
2
4
4
1
3
6
6
7 2 4 1
4 6 7 7
7 6 7 7
7
Lista
List, to STL-owa implementacja listy w skrcie struktura, w ktrej elementy ze rodka moemy
usuwa w czasie staym, ale za to dostp do dowolnego elementu ze rodka listy jest liniowy.
Aby korzysta z list, musimy doda lini:
#include <list>
List moemy przechodzi tylko iteratorem, robimy to tak jak w vectorze, tylko nazw vector
zamieniamy na list:
1
2
3
4
5
l i s t <int> L ;
...
l i s t <int > : : i t e r a t o r i t ;
f o r ( i t = L . b e g i n ( ) ; i t !=L . end ( ) ; i t ++)
c o u t << i t << ;
119
ROZDZIA 7. WYKADY
//
//
//
//
//
//
//
//
//
//
//
//
//
//
Bardzo czsto popenianym bdem przy funkcji erase jest to, e zapominamy, i po jej uyciu
iterator, ktry wskazywa na usunity element, nie wskazuje teraz na aden konkretny element
listy. Jeli chcemy skasowa jaki element i mimo to zapamita, gdzie jestemy (np. przesun
si do nastpnego elementu), musimy zrobi to rcznie, wykorzystujc tymczasowy iterator.
Przykad:
1
2
3
4
5
l i s t <int> L ;
l i s t <int > : : i t e r a t o r i t = v . b e g i n ( ) ;
l i s t <int > : : i t e r a t o r i t t m p = i t ;
i t ++;
L . erase ( it tmp ) ;
7.3.5
Zbir i multizbir
//
//
//
//
//
//
//
//
//
dodanie x do seta
usunicie wszystkich wystpie x z seta/multiseta.
usunicie elementu spod iteratora it
wyczyszczenie caego seta
sprawdzenie czy set jest pusty
liczba elementw seta/multiseta
znajduje iterator elementu x, gdy nie ma zwraca S.end()
znajduje iterator pierwszego elementu wikszego lub rwnego x
znajduje iterator pierwszego elementu wikszego od x
Set moemy przej iteratorem tak samo jak list. Przejdziemy elementy kolejno od najmniejszego do najwikszego. Przy usuwaniu iteratora w secie te naley tworzy tymczasowy iterator,
jeli chcemy zapamita miejsce, w jakim jestemy.
120
ROZDZIA 7. WYKADY
7.3.6
Mapa
map<s t r i n g , int> M;
...
f o r (map<s t r i n g , int > : : i t e r a t o r i t = M. b e g i n ( ) ; i t != M. end ( ) ; i t ++) {
c o u t << i t > f i r s t << , << i t >s e c o n d << e n d l ;
}
Powyszy kod wypisze w kolejnych liniach pary (klucz, warto). Dla danego iteratora it >
f irst to klucz, a it > second to warto (dla przypomnienia co znaczy > naley si cofn do czci ze wskanikami). Elementy zostan wypisane po posortowanym it > f irst.
Wszystkie it > f irst bd rne.
7.3.7
Przeadowanie operatora
W wikszoci poprzednich algorytmw i struktur danych elementy byy porwnywalne za pomoc znaku < (STL nawet sprawdza, czy elementy s rwne, za pomoc znaku <, a jest rwne
b, gdy a nie jest mniejsze od b i b nie jest mniejsze od a). Czyli jeli dla znanego typu danych
lub znanej struktury powiemy jak mona je porwna za pomoc znaku <, to wszystkie algorytmy i struktury, ktre wykorzystyway dany operator, bd dziaa z nowym operatorem (set,
map, sort, lower bound, itd.). Operator moemy przeadowa dodajc pod deklaracj struktury, a przed wykorzystaniem danego operatora w programie. Moemy to zrobi w nastpujcy
sposb:
121
ROZDZIA 7. WYKADY
Powyszy kod tworzy operator <, ktrym moemy porwna dwie butelki. Operator ten ma
odpowiedzie na pytanie: czy obiekt a jest mniejszy od b. Zatem jeli jest to prawd, musi
zwraca true, a jeli jest to faszem, musi zwraca false. Dla doubli ju istnieje interesujcy nas
operator, wic moemy wykorzysta operator porwnujcy double w naszym kodzie. Moemy
powyszy kod bardziej uszczegowi:
1
2
3
4
5
6
7
8
9
...
bool operator <(const b u t e l k a& a , const b u t e l k a& b ) {
i f ( ( a . p r o c e n t y a . l i t r y ) == ( b . p r o c e n t y b . l i t r y ) ) {
return a . nazwa < b . nazwa ;
}
e l s e return ( a . p r o c e n t y a . l i t r y ) < ( b . p r o c e n t y b . l i t r y ) ;
}
...
}
Tak stworzony operator dodaje dodatkowy warunek, e jeeli dwie butelki s rwne wzgldem
poprzedniego operatora, porwna je po nazwie. Czasem wygodnie jest doda porwnanie po nieinteresujcej nas wartoci, eby dla seta obiekty byy rozrnialne.
Czasem chcemy posortowa wektor po jakiej wartoci, a nastpnie posortowa ten sam
wektor po innej wartoci. Oczywicie moemy stworzy dwie rne struktury, dla kadej stworzy
operator i za kadym razem, jak chcemy posortowa po innym kryterium, kopiowa cay wektor,
ale przy niektrych programach moe to by skrajnie niewygodne. Moemy do tego uy funkcji
porwnujcej:
122
ROZDZIA 7. WYKADY
Wszystkie struktury oraz algorytmy posiadaj opcj uycia dowolnej funkcji porwnujcej. Przy
algorytmach zazwyczaj nazw funkcji porwnujcej dodaje si po przecinku. Przy niektrych
strukturach moe by inaczej, po dokadn informacj o kadej strukturze naley zajrze do dokumentacji.
7.3.8
Stabilne sortowanie
Stabilne sortowanie, czyli stable sort. Zauwaylimy przed chwil, e dwa obiekty, ktre s
wedug STL rwne, nie musz by w rzeczywistoci takie same. Sort moe dowolnie przestawi
obok siebie rwne elementy. Jeli chcemy, aby elementy rwne byy zachowane w takiej samej
kolejnoci, jak byy w vectorze przed sortowaniem, naley uy stable sort.
123
Cze
III
,
Grupa olimpijska
Rozdzia 8
Zadania
8.1
Dzie prbny
Zadanie: Pocig
Dostpna pami: 64 MB
Dzie 0, 19.09.2010
Pocig
May Jacu dosta od mamy pocig zoony z n wagonw. Po dokadnym obejrzeniu kadego
z nich stwierdzi, e na odwrocie wagonw znajduje si numer seryjny zoony z maych liter
alfabetu angielskiego.
May Jacu moe ukada wagony w dowolnej kolejnoci, budujc w ten sposb pocig (zawsze z n wagonw), ktry po odwrceniu tworzy pewien tekst w. Znudzio mu si to do
szybko, poniewa chcia zaj si informatyk. W zwizku z tym wymyli zadanie.
Poprosi mamusi, aby napisaa na kartce pewien tekst t. Tekst w uzna za wzorzec, ktrego
bdzie szuka w tekcie t. Jacu chce policzy sum wystpie wszystkich wzorcw (zbudowanych
z kadej permutacji pocigu) w tekcie t.
Wejcie
W pierwszym wierszu wejcia znajduje si jedna liczba cakowita n (1 6 n < 10). W n kolejnych wierszach znajduje si tekst wi oznaczajcy numer seryjny i tego wagonu (dugo
numeru seryjnego nie przekracza 105 ). W kolejnym wierszu znajduje si tekst t (dugo tekstu
t nie przekracza 106 ).
Wyjcie
W jedynym wierszu wyjcia powinna znale si jedna liczba cakowita, rwna sumie wystpie wszystkich wzorcw.
127
ROZDZIA 8. ZADANIA
Przykad
dla danych wejciowych:
2
ala
ma
alamaalama
poprawnym wynikiem jest:
3
128
ROZDZIA 8. ZADANIA
8.2
Dzie pierwszy
Zadanie: Zegary
Dostpna pami: 64 MB
Dzie 1, 20.09.2010
Zegary
W Bajtocji mieszka zegarmistrz Gustaw, ktry od wielu lat naprawia zegary. W jego zakadzie mona znale mnstwo starych zegarw. Interesujce moe by to, e wszystkie zegary s
wskazwkowe. Kady z nich posiada 2 wskazwki: bajtogodzinn i bajtominutow. Obie wskazwki poruszaj si w praw stron. Bajtogodzina w Bajtocji zawsze trwaa 100 bajtominut,
dlatego te wszystkie zegary posiadaj podziak na 100 bajtominut. Dugo dnia w Bajtocji
czsto si zmieniaa, std zegary posiadaj niekoniecznie tak sam podziak na bajtogodziny.
Zegarmistrza chce odwiedzi krl, dlatego te Gustaw postanowi zrobi jak najlepsze wraenie. Stwierdzi, e krlowi spodoba si, jeli wszystkie zegary bd wskazyway taki sam czas.
W tej chwili kady z zegarw jest wyczony. Gustaw nie moe przestawia rcznie zegarw,
gdy s one bardzo stare i mogyby ulec zniszczeniu. Moe natomiast uruchomi jeden dowolny
zegar i poczeka tyle bajtominut, o ile chce przestawi dany zegar. Nie moe uruchamia dwch
zegarw jednoczenie. Pom Gustawowi wybra bajtogodzin i bajtominut, ktr maj wskazywa wszystkie zegary, aby czas potrzebny na ich przestawienie by jak najkrtszy.
Wejcie
Pierwszy wiersz wejcia zawiera jedn liczb cakowit n (1 6 n 6 106 ). W n nastpnych
wierszach znajduj si opisy i tego zegara w postaci trzech liczb cakowitych gi , mi , pi (0 6
gi < pi 6 109 ), oznaczajcych odpowiednio liczb bajtogodzin, wskazywanych aktualnie przez
i-ty zegar, liczb bajtominut oraz wielko podziaki bajtogodzinnej i-tego zegara.
Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera dwie liczby cakowite: liczb bajtogodzin
i liczb bajtominut, ktre bdzie musia czeka Gustaw.
Przykad
dla danych wejciowych:
3
12 20 16
1 10 15
1 10 18
poprawnym wynikiem jest:
4 90
ROZDZIA 8. ZADANIA
Zadanie: Cykl
Dostpna pami: 32 MB
Dzie 1, 20.09.2010
Cykl
Masz podany skierowany graf z wagami na krawdziach. Twoim zadaniem jest znalezienie
cyklu w tym grafie o jak najwikszej redniej wadze krawdzi.
Wejcie
W pierwszym wierszu standardowego wejcia znajduj si dwie liczby cakowite dodatnie n, m
(2 6 n 6 100, 2 6 m 6 104 ), oznaczajce odpowiednio liczb wierzchokw oraz krawdzi grafu.
W kolejnych m wierszach znajduje si opis kolejnych krawdzi w postaci trzech liczb a, b, c (1 6
a, b 6 n, a <> b, 0 6 c 6 106 ). Oznacza to, e istnieje krawd z wierzchoka a do wierzchoka b
o wadze krawdzi c. Midzy kad par wierzchokw bdzie istniaa co najwyej jedna krawd
w kad stron.
Wyjcie
W pierwszym i jedynym wierszu wyjcia powinna si znajdowa jedna liczba rzeczywista,
rwna maksymalnej redniej wadze cyklu w podanym grafie. Liczba ta powinna by zapisana
z dokadnoci do 4 miejsc po przecinku. Moesz zaoy, e w grafie zawsze bdzie istnia jaki
cykl.
Przykad
dla danych wejciowych:
5
1
2
3
2
4
5
6
2
3
1
4
2
4
6
2
3
1
5
100
130
ROZDZIA 8. ZADANIA
Dzie 1, 20.09.2010
Wejcie
W pierwszej linii znajduje si jedna liczba cakowita z, oznaczajca liczb zestaww danych
do rozpatrzenia.
W pierwszej linii kadego zestawu danych znajduje si jedna liczba cakowita n (1 6 n 6
2 105 ), oznaczajca liczb rund KI. W kolejnych n liniach opis kadej rundy w postaci trzech
i
liczb cakowitych ai , bi , ci (0 6 ai < bi 6 109 , bi a
< ci 6 bi ai ), oznaczajce, e i-ta
2
runda zaczyna si w ai -tej jednostce czasu, koczy si w bi -tej jednostce czasu, oraz Olgierd
chce powici na t rund ci jednostek czasu. Suma n we wszystkich zestawach danych nie
przekroczy 106 .
Wyjcie
Dla kadego zestawu danych jedno sowo TAK, jeeli Olgierd moe zrealizowa swj plan,
bd NIE jeeli jest to niemoliwe.
131
ROZDZIA 8. ZADANIA
Przykad
dla danych wejciowych:
2
2
1
1
2
1
2
5 3
2 1
5 3
3 1
132
ROZDZIA 8. ZADANIA
8.3
Dzie drugi
Dostpna pami: 32 MB
Dzie 2, 21.09.2010
Wejcie
W pierwszej linii wejcia znajduj si dwie liczby cakowite n i m (1 6 n 6 500000, 1 6 m 6
109 ), odpowiednio dugo cigu A i liczba m.
W nastpnym wierszu n liczb cakowitych kolejne elementy cigu A (0 6 ai 6 109 ).
Wyjcie
Pierwszy i jedyny wiersz wyjcia powinien zawiera jedn licz cakowit liczba najduszych rosncych podcigw modulo m.
Przykad
dla danych wejciowych:
4 10
3 2 5 4
poprawnym wynikiem jest:
4
133
ROZDZIA 8. ZADANIA
Zadanie: ABC
Dostpna pami: 64 MB
Dzie 2, 21.09.2010
ABC
Dane s dwa cigi znakw X i Y , skadajce si z liter a,b i c. Naley znale najduszy
niemalejcy wsplny podcig cigw X i Y . Inaczej mwic, naley znale najduszy cig,
ktry:
jest podcigiem cigw X i Y , czyli da si go otrzyma przez usunicie pewnych liter
z cigw X i Y ;
jest niemalejcy pod wzgldem kolejnoci liter w alfabecie, czyli przed wystpieniem litery
v nie wystpi litera o wikszym kodzie ASCII ni v.
Dugoci cigw X i Y nie przekraczaj 200000.
Wejcie
W pierwszej linii znajduj si dwie liczby cakowite n i m (1 6 n, m 6 200000), oznaczajce
dugoci cigw X i Y .
W drugiej linii znajduje si cig X, a w nastpnej Y .
Wyjcie
W pierwszym wierszu naley wypisa dugo najduszego cigu speniajcego warunki
zadania.
Przykad
dla danych wejciowych:
5 6
cabbc
bacbcc
poprawnym wynikiem jest:
3
134
ROZDZIA 8. ZADANIA
Dostpna pami: 32 MB
Dzie 2, 21.09.2010
Cikie klocki
May Bobbie otrzyma na urodziny zestaw klockw. Jego rodzice wiedzieli dobrze, e nie
jest to zbyt oryginalny prezent i gdzie ju syszeli o dzieciach otrzymujcych rne odmiany
stymulujcych intelektualnie klockw. Postanowili wic tym razem postawi nie na rozmiar,
lecz na wag. Kady z fascynujcych klockw ma swoj wag, wyraajc si dodatni liczb
cakowit. adne dwa klocki nie wa tyle samo. Na nieszczcie dla Bobbiego, jego rodzice s
mionikami zagadek logicznych, postanowili wic przerwa jego beztrosko prymitywn zabaw
i przygotowa dla niego zadanie do wykonania.
Klocki zostay ustawione w rzdzie, jeden obok drugiego. Rodzice wyjanili Bobbiemu,
e klocki s tak skonstruowane, e jeli ktry z nich zostanie popchnity w jedn ze stron,
to przewrci wszystkie lejsze od niego (na zasadzie domina) po tej stronie, a do pierwszego
klocka ciszego ni ten popchnity bd do pierwszego miejsca, gdzie jest przewrcony wczeniej
klocek. Z umiechami na ustach zaproponowali Bobbiemu, e jeli uda mu si znale sposb
na przewrcenie wszystkich klockw w najmniejszej moliwej liczbie popchni, to bdzie mg
powrci do swych poprzednich infantylnych zabaw.
Oczywicie Bobbie ani myli si tym zajmowa, woli oglda wzorki na dywanie. Ale Ty moesz podj wspaniay zamiar i pomc Bobbiemu poprzez napisanie programu, ktry odnajdzie
dan liczb popchni klockw.
Wejcie
Pierwsza linia wejcia zawiera liczb cakowit n liczb klockw. (1 6 n 6 106 ). W kolejnej
linii znajduje si n rnych liczb cakowitych z przedziau od 1 do 109 wagi kolejnych klockw
ustawionych w rzdzie.
Wyjcie
Jedyna linia wyjcia powinna zawiera jedn liczb najmniejsz liczb popchni klockw
potrzebn do przewrcenia ich wszystkich.
Przykad
dla danych wejciowych:
7
3 5 7 2 1 6 4
poprawnym wynikiem jest:
2
8.4
ROZDZIA 8. ZADANIA
Dzie trzeci
Zadanie: Guziki
Dostpna pami: 32 MB
Dzie 3, 22.09.2010
Guziki
Mi Jogi wymyli sobie now zabaw. Uoy na stole kwadrat z n2 guzikw i zastanawia
si, ile jest takich prostych przechodzcych przez guzik lecy na rodku kwadratu, eby liczba
guzikw lecych na kadej z tych prostych bya rwna g. Zakadamy, e guziki s punktami
na paszczynie.
Wejcie
W pierwszym i jedynym wierszu wejcia znajduj si dwie liczby cakowite n i g (1 6 g 6
n < 2 106 , n nieparzyste).
Wyjcie
W jedynym wierszu wyjcia powinna znale si jedna liczba cakowita rwna liczbie prostych
z treci zadania. Jeeli liczba prostych jest wiksza od 1012 wypisz 1.
Przykad
dla danych wejciowych:
3 3
poprawnym wynikiem jest:
4
136
ROZDZIA 8. ZADANIA
Zadanie: Pokoje
Dostpna pami: 32 MB
Dzie 3, 22.09.2010
Pokoje
W bajtockim hotelu ukry si tajny szpieg Pitu. Obawiajc si, e kto zna numer pokoju,
w ktrym si znajduje, poprzekrca on w nocy niektre 9 na 6, a niektre 6 na 9.
W poszukiwaniu szpiega do hotelu przyby agent Dejf. Udao mu si ju dowiedzie, w ktrym pokoju zakwaterowa si Pitu oraz pozna fakt poprzekrcania 6 i 9. Niestety Dejf zna tylko
numer pokoju Pitusia przed przekrceniem. Agent zastanawia si teraz, ile pokoi musi sprawdzi,
aby mie pewno, e znajdzie szpiega.
Wiedzc, ile pokoi znajduje si w hotelu oblicz, ile pokoi musi sprawdzi Dejf. Wystarczy,
e podasz reszt z dzielenia pokoi przez 107 3.
Wejcie
W pierwszym wierszu wejcia znajduje si jedna liczba cakowita h (1 6 h 6 101000000 ),
oznaczajca liczb pokoi w hotelu. W drugim wierszu wejcia znajduje si jedna liczba cakowita
n (1 6 n 6 h), oznaczajca numer pokoju, w ktrym zakwaterowa si Pitu.
Wyjcie
W pierwszym i jedynym wierszu wyjcia powinna znale si jedna liczba cakowita, rwna
reszcie z dzielenia przez 107 3 pokoi, ktre musi sprawdzi Dejf.
Przykad
dla danych wejciowych:
1000
690
poprawnym wynikiem jest:
4
137
ROZDZIA 8. ZADANIA
Dostpna pami: 64 MB
Dzie 3, 22.09.2010
Przyjazne punkty
Na paszczynie mamy n punktw. Kady punkt ma rn wsprzdn x oraz y (nie ma
takich dwch punktw, ktrych wsprzdne x-owe s takie same, oraz nie ma takich dwch
punktw, ktrych wsprzdne y-owe s takie same).
Mwimy, e dwa punkty s przyjazne sobie nawzajem, gdy prostokt o bokach rwnolegych
do osi wsprzdnych oraz tych dwch punktach w naprzeciwlegych wierzchokach nie zawiera
wewntrz siebie adnego innego punktu. Twoim zadaniem jest policzenie liczby par przyjaznych
punktw.
Wejcie
W pierwszej linii znajduje si jedna liczba cakowita n (1 6 n 6 105 ), rwna liczbie punktw.
W kolejnych n liniach znajduj si wsprzdne kolejnych punktw (0 6 x, y 6 106 ).
Wyjcie
W pierwszym wierszu wyjcia powinna si znale jedna liczba cakowita, rwna liczbie par
przyjaznych punktw.
Przykad
dla danych wejciowych:
4
0
1
2
3
1
2
3
0
138
ROZDZIA 8. ZADANIA
8.5
Dzie czwarty
Dostpna pami: 32 MB
Dzie 4, 23.09.2010
Dziwna planeta
Pewnego razu gdzie tam sobie istniaa n-wymiarowa przestrze. Znajdowaa si tam rwnie pewna dziwna planeta. Jedn z jej przedziwnych cech by jej ksztat n-wymiarowy hiperszecian o jednostkowej dugoci boku. W kadym wierzchoku planety znajdowao si pewne
dziwne miasto.
Terytorium tej planety zostao podzielone midzy trzy wrogie krlestwa. Jednak kilka miast
ogosio swoj niezaleno nazwijmy je neutralnymi. i-te miasto jest niezalene, jeli d1 (i) =
d2 (i) = d3 (i), gdzie dj (i) oznacza odlego midzy i-tym miastem oraz stolic j-tego krlestwa.
Wszystkie odlegoci liczone s przy pomocy metryki miejskiej.
Twoim zadaniem jest obliczenie liczby neutralnych miast. Ze wzgldu na to, e wynik moe
by duy, wystarczy wypisa go modulo 109 + 7.
Wejcie
Wejcie zawiera trzy linie. W kadej linii znajduj si wsprzdne stolicy kolejnego krlestwa
w postaci liczby binarnej dugoci n (1 6 n 6 105 ).
Wyjcie
W pierwszym i jedynym wierszu wyjcia powinna si znale jedna liczba cakowita rwna
liczbie neutralnych miast modulo 109 + 7.
Przykad
dla danych wejciowych:
01
01
10
poprawnym wynikiem jest:
2
139
ROZDZIA 8. ZADANIA
Zadanie: Kupiec
Dostpna pami: 64 MB
Dzie 4, 23.09.2010
Kupiec
W Bajtlandii sie drg midzy miastami jest taka, e midzy dwoma dowolnymi miastami
istnieje dokadnie jedna droga (bezporednia lub porednia).
Pewien kupiec przyjecha do Bajtlandii w celach zarobkowych. Pierwszego dnia chciaby
zamieszka w dowolnym miecie (miasto pocztkowe), a nastpnie uda si do wybranego miasta
(miasto kocowe). Kupiec na drodze z jednego miasta do drugiego nie moe dwa razy odwiedzi
tego samego miasta (ze wzgldu na przepisy prawne Bajtalndii). Chciaby jednak wybra miasto
pocztkowe i kocowe w taki sposb, aby jego zarobek by jak najwikszy.
Kupiec zarabia poruszajc si pomidzy miastami. Dla kadego bezporedniego poczenia
wiemy, ile bajtalarw kupiec zarobi lub straci.
Pom wybra kupcowi dwa miasta tak, aby jego zarobek by jak najwikszy (w szczeglnoci
miasto pocztkowe i kocowe moe by tym samym miastem).
Wejcie
W pierwszej linii wejcia znajduje si jedna liczba cakowita n (2 6 n 6 106 ). W nastpnych
n 1 wierszach znajduj si po trzy liczby cakowite a, b, x (109 6 x 6 109 ), oznaczajce,
e istnieje bezporednie poczenie midzy miastami a i b, w ktrym kupiec zarobi x bajtalarw
(ujemne x oznacza strat kupca).
Wyjcie
W pierwszym i jedynym wierszu wyjcia powinna znale si jedna liczba cakkowita oznaczajca maksymalny zarobek kupca.
Przykad
dla danych wejciowych:
6
1
3
4
3
5
3
2
3
5
6
3
2
2
-1
4
140
ROZDZIA 8. ZADANIA
Dostpna pami: 64 MB
Dzie 4, 23.09.2010
Materiay wybuchowe
Dostae kontrakt na przewz materiaw wybuchowych. Dysponujesz n ciarwkami, kada
o pojemnoci xi .
Dla kadej ciarwki musisz zaplanowa, jak zapakowa j materiaami wybuchowymi. Niestety kada ciarwka musi by szczelnie wypeniona materiaami wybuchowymi, gdy w innym
wypadku podczas przewozu materiay mog ulec uszkodzeniu. Masz do dyspozycji k rnych
rodzajw materiaw wybuchowych o rnych wielkociach yi . Kadego z materiaw moesz zawsze wyprodukowa tyle, ile potrzebujesz. Ze wzgldu na szybko pakowania i rozadowywania
ciarwek zaley ci, aby do zapakowania ciarwki uy jak najmniej materiaw.
Policz, ile materiaw uy dla kadej ciarwki.
Wejcie
W pierwszej linii wejcia znajduj si dwie liczby cakowite n, k (1 6 n 6 1000, 1 6 k 6 100),
oznaczajce odpowiednio ile jest ciarwek oraz ile jest rodzajw materiaw wybuchowych.
W nastpnych k liniach znajduj si kolejne wielkoci kolejnych rodzajw materiaw yi , (1 6
yi < 105 ). Mona zaoy e dwa dowolne rodzaje materiaw maj zawsze rne wielkoci.
W nastpnych n liniach znajduj si wielkoci kolejnych ciarwek xi (1010 6 xi 6 1017 ).
Wyjcie
Na wyjciu w kadej z kolejnych n linii powinna znale si pojedyncza liczba wi , mwica ile
najmniej materiaw wybuchowych naley uy, aby szczelnie zapakowa i-t ciarwk, bd
pojedyncze sowo NIE jeli jest to niemoliwe.
Przykad
dla danych wejciowych:
3 2
10000
10100
10000000000
10000000001
10000000002
poprawnym wynikiem jest:
990100
NIE
NIE
141
8.6
ROZDZIA 8. ZADANIA
Dzie pity
Dostpna pami: 64 MB
Dzie 5, 24.09.2010
Wejcie
W pierwszej linii wejcia znajduj si dwie liczby cakowite n i m (1 6 n, m 6 2000)
dugoci cigw A i B.
W nastpnych dwch liniach znajduj si cigi A i B, skadajce si z dodatnich liczb
cakowitych nie wikszych ni 109 .
Wyjcie
W pierwszym wierszu naley wypisa dugo najduszego takiego podcigu.
W nastpnej linii naley wypisa kolejne elementy cigu oddzielone pojedynczymi spacjami.
Jeeli istnieje wiele poprawnych rozwiza, naley wypisa dowolne z nich.
Przykad
dla danych wejciowych:
6 7
2 2 1 3 2 3
2 1 2 3 1 3 3
poprawnym wynikiem jest:
4
2 2 3 3
142
ROZDZIA 8. ZADANIA
Zadanie: Bubu
Dostpna pami: 64 MB
Dzie 5, 24.09.2010
Bubu
Bubu wyszo z jaskini szuka piknikw, jednak zauwayli je stranicy parku Jellystone. Stranicy prbuj zagrodzi drog Bubu, ktre ucieka do jaskini. Stranik zapie Bubu, jeli znajdzie
si w tym samym czasie na polanie, na ktrej jest Bubu. Stranik moe odpoczywa na polanach.
Wejcie
W pierwszej linii standardwoego wejcia znajduj si trzy liczby cakowite n, m, s, (1 6 n 6
6 m 6 2 105 , 0 6 s 6 3 104 ), oznaczajce odpowiednio liczb polan w lesie, liczb
przesiek midzy tymi polanami oraz liczb stranikw.
W nastpnych m liniach znajduj si opisy (dwukierunkowych) przesiek w postaci trzech
liczb cakowitych a, b, w, (1 6 a, b 6 n, 1 6 w 6 109 ), gdzie a, b oznaczaj numery polan,
za w oznacza czas w sekundach, jaki zajmuje stranikowi lub Bubu przebycie tej przesieki.
W nastpnych s liniach podane s numery polan, na ktrych stoj kolejni stranicy.
W ostatniej linii podany jest numer polany, na ktrej znajduje si Bubu. Jaskinia Bubu jest
na polanie 1.
105 , 0
Wyjcie
Jeeli Bubu moe dotrze do jaskini niezapany przez stranikw, naley wypisa minimalny
czas dotarcia Bubu do jaskini, w innym przypadku naley wypisa 1 . Zakadamy, e istnieje
cieka midzy jaskini Bubu a polan, gdzie si ono znajduje.
Przykad
dla danych wejciowych:
2 1 0
1 2 1
2
poprawnym wynikiem jest:
1
143
ROZDZIA 8. ZADANIA
Zadanie: Myszka
Dostpna pami: 64 MB
Dzie 5, 24.09.2010
Myszka
Maa myszka zostaa zamknita w wielkim labiryncie.
Labirynt ten skada si z n pokoi, midzy ktrymi jest m korytarzy. Jednak kady korytarz
ma jak szeroko i jeeli myszka bdzie zbyt gruba, to nie bdzie w stanie si przez niego
przecisn.
Zadania nie uatwia morzcy j gd. W niektrych pokojach znajduje si kawaek przepysznego sera. Jeeli myszka kiedykolwiek wejdzie do tego pokoju, to nie moe si oprze i zjada
cay kawaek. Zjedzenie kawaka sera moe sprawi, e myszce przybdzie na masie i moe jej
to uniemoliwi korzystania z niektrych korytarzy.
Znajc plan labiryntu, szeroko korytarzy, rozmieszczenie kawakw sera, pocztkowe pooenie myszki oraz pokj, ktry jest wyjciem z labiryntu, odpowiedz na pytanie, jaka moe by
najwiksza pocztkowa grubo myszki, tak aby byo moliwe wyjcie z labiryntu. Zakadamy,
e pocztkowa waga myszki jest wiksza bd rwna 0.
Wejcie
W pierszym wierszu wejcia znajduj si cztery liczby cakowite n, m, s, d (1 6 n 6 106 , 1 6
m 6 2 106 , 1 6 s, d 6 n, s <> d), oznaczajce kolejno: liczb pokoi w labiryncie, liczb korytarzy, pocztkow pozycj myszki oraz numer pokoju w ktrym znajduje si wyjcie z labiryntu.
W kolejnym wierszu znajduje si n liczb cakowitych s1 , s2 , ..., sn (0 6 si 6 109 ), gdzie si
oznacza, e grubo myszki si zwikszy o si , jeeli zje ona ser z i-tego pokoju (jeeli si = 0,
to w tym pokoju nie ma sera).
W nastpnych m wierszach znajduje si opis kolejnych korytarzy. Kady korytarz opisany
jest przez trzy liczby cakowite a, b, c (1 6 a, b 6 n, 1 6 c 6 109 ), oznaczajce, e dany korytarz
czy pokoje a oraz b i myszka moe mie grubo maksymalnie c, aby przecisn si przez dany
korytarz.
Wyjcie
Wyjcie powinno zawiera jedn liczb cakowit, rwn maksymalnej wadze myszki, takiej
e myszka moe wydosta si z labiryntu, lub 1, jeli myszka nie moe wydosta si z labiryntu.
Przykad
dla danych wejciowych:
2 1 1 2
1 0
1 2 5
poprawnym wynikiem jest:
4
144
Rozdzia 9
Rozwizania
9.1
Dzie prbny
Opracowanie: Pocig
Dostpna pami: 64 MB
Dzie 0, 19.09.2010
Pocig
Wstp
Niech n bdzie liczb wagonw, m bdzie dugoci tekstu t oraz s bdzie sum dugoci
numerw seryjnych.
Rozwizanie brutalne
Zadanie mona w dosy prosty sposb zrobi w zoonoci O(n!sm). Przegldamy wszystkie
permutacje wagonw, wyszukujc wzorca w tekcie brutalnie w zoonoci O(sm).
Rozwizanie wolne
Powysze rozwizanie mona udoskonali, wyszukujc wzorzec liniowo przy pomocy algorytmu KMP, Rabina-Karpa bd Boyera-Moorea. Opisy tych algorytmw mona znale w literaturze bd w Internecie. Rozwizanie owo dziaa w zoonoci O(n!(s + m)).
Rozwizanie wzorcowe
Przedstawione algorytmy nie korzystaj z faktu, e wszystkie wzorce maj takie same dugoci. Dla rozwizania wzorcowego jest to bardzo istotne. Mona bowiem zmodyfikowa algorytm
Rabina-Karpa tak aby w zoonoci O(w + (t + l) log t) (gdzie t to dugo tekstu, w to suma
dugoci wzorcw, a l to liczba wzorcw) znale wszystkie wystpienia.
Dalsza cz omwienia wymaga znajomoci algorytmu Rabina-Karpa w postaci podstawowej. Aby rozszerzy ten algorytm, wpierw znajdujemy hasze wszystkich podsw tekstu o dugoci takiej, jak ma kady wzorzec, oraz wrzucamy je do mapy M , zliczajc ile razy wystpuje
145
ROZDZIA 9. ROZWIZANIA
jaki hasz. Nastpnie wystarczy zhaszowa wszystkie wzorce i dla kadego przy pomocy mapy M
stwierdzi, ile razy wystpuje on w tekcie. Jednak zastowowanie tego algorytmu wprost da nam
zoono O(n!s + (m + n!) log m), czyli gorzej ni drugie rozwizanie. Wida, e najbardziej
czasochonne jest tutaj liczenie haszy dla wzorcw.
Mona to zrobi szybciej w zoonoci O(n!n) dla wszystkich wzorcw. Korzystamy tutaj
z faktu e nasze wzorce s popermutowanymi zlepkami tych samych sw. Dokadny sposb,
jak to zrobi, zostawi jako wiczenie dla Czytelnika. Kocow zoonoci naszego rozwizania
jest zatem O(n!n + (m + n!) log m).
Dodatkowe uwagi
Hasze sw naley zawsze liczy, trzyma i generalnie robi z nimi wszystko na long long-ach.
Wie si to z tzw. paradoksem dnia urodzin, ktry mwi, e jeeli losujemy liczby z przedziau
od 1 do n, to przecitna liczba losowa potrzebna do tego, by jaka si powtrzya, jest pro
porcjonalna do n. Wg bada przeprowadzonych przez amerykaskich naukowcw przecitna
liczba losowa liczb z zakresu int-a, tak aby jaka si powtrzya, wynosi okoo 82000. Tak wic,
haszujc na int-ach, rednio co 82000 rne sowo bdzie miao ten sam hasz, co bdzie prowadzio do kolizji i bdnej odpowiedzi.
Niestety amerykascy naukowcy nie dysponowali wystarczajco dobrym sprztem, aby doprowadzi choby do jednej kolizji na long longach, co jest najlepszym dowodem ich niezawodnoci.
146
ROZDZIA 9. ROZWIZANIA
9.2
Dzie pierwszy
Opracowanie: Zegary
Dostpna pami: 64 MB
Dzie 1, 20.09.2010
Zegary
Drobne uproszczenie
Pierwsz rzecz, jak naley zauway jest to, e warto przej z liczenia czasu z (godziny,
minuty) na liczenie czasu w samych minutach. Nastpnie po policzeniu wyniku przechodzimy
ponownie na notacj (godziny, minuty). Naley przy tym pamita, aby uywa zmiennych
64-bitowych.
Rozwizanie wzorcowe
Minut wskazywan przez pewien z zegarw nazwijmy minut pocztkow. Minut, ktr
bd wskazyway wszystkie zegary nazwijmy minut kocow. Pierwszym spostrzeeniem jest
to, e zawsze minut kocow musi by ktra z minut pocztkowych. Dlaczego? Przypumy,
e minuta kocowa nie jest minut pocztkow. Wtedy, jeli bymy przesunli minut kocow do najbliszej wczeniejszej minuty pocztkowej, to kady z zegarw moglibymy wczy
na krtszy okres czasu.
Kolejnym spostrzeeniem jest to, e minuta kocowa musi by mniejsza od najmniejszego
zegara, gdy inaczej najmniejszy zegar nie mgby wskaza danej godziny.
W rozwizaniu musimy wic sprawdzi, czy minut kocow moe by kada z minut pocztkowych mniejszych od wielkoci najmniejszego zegara. W tym celu najpierw sortujemy wszystkie
minuty pocztkowe. Nastpnie przypuszczamy, e minut kocow jest najwczeniejsza minuta
pocztkowa i liczymy, o ile musimy przesun wszystkie zegary. Nastpnie przechodzimy do kolejnych przypuszczanych wartoci minut kocowych (wybieramy je wedug posortowanych wartoci
minut pocztkowych), dla ktrych moemy atwo aktualizowa wynik.
Przykad: mamy nastpujce zegary: (5-minutowy, wskazywana minuta 2), (5-minutowy,
wskazywana minuta 4), (12-minutowy, wskazywana minuta 5), (7-minutowy, wskazywana minuta
6). Zegary musimy obrci o kolejno (0, 3, 9, 3), czyli w sumie o 15. Teraz jeli zaoymy,
e minut kocow jest kolejna (co do wielkoci) minuta pocztkowa, to moemy atwo obliczy
(w czasie staym) o ile w sumie musimy przesun wszystkie zegary. Czas, o jaki musimy
przesun zegary, ktre wskazuj now minut kocow, zostanie wyzerowany (gdy wszystkie
zegary dorwnujemy do danej wartoci, wic zegarw wskazujcych dan warto nie musimy
przesuwa), a wszystkie pozostae zegary bdziemy musieli przesun o rnic nowej wartoci
kocowej i starej wartoci kocowej.
Bardziej formalnie jeli przechodzimy z minuty kocowej x do minuty kocowej y:
(wynik dla y) = (wynik dla x) + (liczba wszystkich zegarw liczba zegarw wskazujcych y)
* (y-x) - (suma wartoci, o jakie musielimy przesun zegary wskazujce y). Wszystko przy
zaoeniu, e y > x, oraz e aden zegar nie wskazuje godziny pomidzy y i x.
Czyli nowe wartoci o jakie musimy przesun zegary z przykadu, jeli zaoymy, e godzin
pocztkow jest 4, to (2, 0, 11, 5), czyli 18.
147
ROZDZIA 9. ROZWIZANIA
Opracowanie: Cykl
Dostpna pami: 32 MB
Dzie 1, 20.09.2010
Cykl
Rozwizanie wzorcowe
Zadanie mona rozwiza wykorzystujc wyszukiwanie binarne po wyniku.
Zamy, e chcemy stwierdzi, czy istnieje cykl o redniej wadze wikszej bd rwnej S. Jeli
tak, to zamy, e ma on k krawdzi o wagach a1 , a2 , ..., ak , ktrych suma wynosi R. Musi on
spenia nastpujc nierwno, ktr nieco przeksztacimy:
R/k >= S
R >= S k
a1 + a2 + ... + ak >= S k
a1 + a2 + ... + ak >= S + S + S + ... + S (k razy)
(a1 S) + (a2 S) + ... + (ak S) >= 0
W zwizku z tym szukamy takiego cyklu, w ktrym, po odjciu od kadej krawdzi wagi S,
cykl bdzie mia nieujemn sum wag. Jak stwierdzi, czy istnieje taki cykl? Mona od kadej
krawdzi grafu odj S, a nastpnie znale w grafie cykl o dodatniej wadze. Mona to zrobi na
co najmniej 2 sposoby. Uywajc algorytmu Floyda-Warshalla albo algorytmu Bellmana-Forda.
W zalenoci od metody otrzymujemy rozwizanie o zoonoci O(N 3 log C), bd O(N M log C).
148
ROZDZIA 9. ROZWIZANIA
149
9.3
ROZDZIA 9. ROZWIZANIA
Dzie drugi
Dostpna pami: 32 MB
Dzie 2, 21.09.2010
ROZDZIA 9. ROZWIZANIA
znale za pomoc wyszukiwania binarnego. Cay algorytm ma zatem zoono O(n log n).
W poniszym pseudokodzie uylimy nastpujcych oznacze:
W.last - zwraca ostatni element wektora W
W.push(a) - wrzuca na koniec wektora W element a
W [i] - zwraca i-ty element wektora
P = (a, b) - para liczb a i b
P.l1 - pierwszy element pary
P.l2 - drugi element pary
1
2
3
4
5
6
7
8
9
10
11
12
13
S [ 0 ] := ( 0 , 1 )
f o r i := 1 to n do
S [ i ] := ( INF , 0 )
l i c := 0
f o r i := 1 to n do
wczytaj (b)
j := [ maksymalne j , g d z i e S [ j ] . l a s t . l 1 < b ] { wyszukujemy b i n a r n i e }
k := [ maksymalne k , g d z i e S [ j ] [ k ] . l 1 >= b ] { wyszukujemy b i n a r n i e }
i l e := ( S [ j ] . l a s t . l 2 S [ j ] [ k ] . l 2 ) mod m
S [ j + 1 ] . push ( ( b , S [ j ] . l a s t . l 2 + i l e ) )
i f j +1 > l i c then
l i c := j +1
wypisz ( S [ l i c ] . l a s t . l 2 )
151
ROZDZIA 9. ROZWIZANIA
Opracowanie: ABC
Dostpna pami: 64 MB
Dzie 2, 21.09.2010
ABC
Rozwizanie
Zamy, e w naszym rozwizaniu jest k literek a oraz l literek c. Niech j bdzie pozycj,
na ktrej wystpia kta litera a w cigu X, a A[j] pozycj, na ktrej wystpia kta litera a
w cigu Y .
Podobnie niech i bdzie pozycj, na ktrej wystpia lta od koca litera c w cigu X, a C[i]
bdzie pozycj, na ktrej wystpia lta od koca litera c w cigu Y . O ile i > j oraz C[i] >
A[j], to w rozwizaniu moe by maksymalnie min(BX [j...i], BY [A[j]...C[i]]) liter b, gdzie BX
i BY jest liczb liter b w pewnym przedziale cigu odpowiednio X lub Y . Zatem cznie
najduszy wsplny podcig rosncy bdzie mia dugo min(BX [j...i], BY [A[j]...C[i]]) + k + l.
Jeeli zatem sprawdzimy wszystkie moliwe k i l, obliczymy dugo najduszego wsplnego
rosncego podcigu, ktra ma k liter a i l liter b, i znajdziemy maksymaln z takich wartoci,
to otrzymamy rozwizanie. Zauwamy, e ilo liter b na dowolnym przedziale moemy szybko
obliczy za pomoc sum prefiksowych. Musimy zatem znale wartoci k i l, dla ktrych warto
min(BX [i] BX [j], BY [C[i]] BY [A[j]]) + k + l jest maksymalna.
Rozbijmy powysze minimum na dwa przypadki. Niech M 1 bdzie maksimum z wartoci:
BX [i] BX [j] + k + l
(9.1)
(9.2)
dla takich k i l, ktre speniaj BX [i] BX [j] > BY [C[i]] BY [A[j]]. Jeli obliczymy wartoci
M 1 oraz M 2, to rozwizaniem zadania bdzie max(M 1, M 2).
Zajmiemy si teraz obliczaniem M 1. Przeksztamy warunek i wyraenie (1), tak aby oddzielnie zgrupowa wartoci, ktre s zalene od k, a oddzielnie te, ktre s zalene od l. M 1 bdzie
maksimum z wartoci:
(BX [i] + l) + (k BX [j])
(9.3)
dla takich k i l, ktre speniaj BX [i] BY [C[i]] < BX [j] BY [A[j]].
Nasze rozwizanie bdzie polegao na sprawdzaniu kadego l i znajdowaniu dla niego takiego
k, ktre spenia warunek BX [i] BY [C[i]] < BX [j] BY [A[j]] i ma najwiksz spord wartoci
(k BX [j]). W ten sposb zmaksymalizujemy warto (3), poniewa dla konkretnego l warto
(BX [i] + l) jest staa. Niech zatem (BX [j] BY [A[j]]) bdzie dla kadego k kluczem w drzewie
przedziaowym, a (k BX [j]) wartoci. Zatem nasz problem sprowadza si do znalezienia
maksimum na przedziale ((BX [i]BY [C[i]]), ). Ostatecznie M 1 bdzie maksymaln z wartoci
(3) spord wszystkich l.
Analogicznie przeksztacamy warunek i wyraenie (2). M 2 bdzie maksimum z wartoci:
(BY [C[i]] + l) + (k BY [A[j]])
(9.4)
dla takich k i l, ktre speniaj BX [i]BY [C[i]] > BX [j]BY [A[j]]. Podobnie jak przy obliczaniu
M 1, bdziemy sprawdza wszystkie l i wybiera najlepsze k. Tym razem kluczem w drzewie
152
ROZDZIA 9. ROZWIZANIA
153
ROZDZIA 9. ROZWIZANIA
Dostpna pami: 32 MB
Dzie 2, 21.09.2010
Cikie klocki
Oznaczenia
Niech K[i] bdzie wag i-tego klocka.
Przez rozbicie bdziemy mieli na myli zepchnicie wszystkich klockw, o ktrych jest mowa.
Przez DP [a][b] bdziemy oznaczali wynik dla przedziau klockw [a, b] (przy programowaniu
dynamicznym wyjanione dokadniej pniej)
ROZDZIA 9. ROZWIZANIA
i n t o b l i c z w y n i k ( c i a g k l o c k o w T)
i f r o z m i a r (T) == 1 then r e t u r n 1
i f r o z m i a r (T) == 0 then r e t u r n 0
x = n a j w i e k s z y k l o c e k (T)
i n t wynik lewo := o b l i c z w y n i k ( p o p c h n i j l e w o ( x , T) )
i n t wynik prawo := o b l i c z w y n i k ( p o p c h n i j p r a w o ( x , T) )
r e t u r n min ( wynik lewo , wynik prawo ) + 1
155
ROZDZIA 9. ROZWIZANIA
156
ROZDZIA 9. ROZWIZANIA
9.4
Dzie trzeci
Opracowanie: Guziki
Dostpna pami: 32 MB
Dzie 3, 22.09.2010
Guziki
Oznaczenia
Oznaczenia przyjmujemy takie jak w zadaniu: n - bok kwadratu, ktry uoylimy, g - liczba
guzikw, ktre maj przecina poszukiwane proste, bxc to cz cakowita z liczby x.
Spostrzeenia
1. atwiej jest myle o zadaniu, jeli ustalimy, e guzik rodkowy ma wsprzdn (0,0),
a wszystkie pozostae guziki s punktami kratowymi o wsprzdnych z przedziau [ n2 , n2 ],
oraz liczba guzikw, jakie przecina prosta, jest liczb punktw kratowych, ktre przecina
prosta. Interesuj nas jedynie proste, ktre przecinaj rodek ukadu wsprzdnych,czyli
takie proste, ktre maj rwnanie y = ax, oraz prosta pionowa. Oznaczmy, e n0 = n2 .
2. Jeli g = n, to wynikiem zawsze jest 4, gdy s dwie proste y = x, y = x, y = 0,
oraz prosta pionowa, ktre przecinaj n guzikw. W dalszej czci opracowania moemy
zaoy, e g 6= n.
3. Jeli jaka prosta przecina (oprcz punktu (0,0)) x guzikw w grnej poowie ukadu
wsprzdnych, to przecina take x guzikw w dolnej czci ukadu wsprzdnych. Niech
q 0 = q1
2 i ograniczmy si do grnej czci ukadu wsprzdnych (zauwamy, e zabralimy
rodkowy guzik).
4. Niech p : y = ap x bdzie dowoln prost przechodzc przez 1. wiartk ukadu wsprzdnych. Jeli p przecina x guzikw, to take prosta p0 : y = ap x przecina x guzikw, co jest
oczywiste. Dziki temu moemy ograniczy si tylko do 1. wiartki ukadu wsprzdnych,
jeli bdziemy pamitali, aby wynik pomnoy przez 2.
5. Jeli liczba guzikw g = 1, to prostych bdzie nieskoczenie wiele.
Rozwizanie wzorcowe
Lemat.1. Prosta p : y = ax przecina punkt kratowy (s, r), r i s cakowite wtedy i tylko
wtedy gdy mona zapisa j w postaci p : y = rs x. Ponadto jeli r i s s wzgldnie pierwsze,
to wszystkie punkty kratowe przecinane przez prost p moemy zapisa w postaci (k r, k s),
gdzie k jest liczb cakowit.
157
ROZDZIA 9. ROZWIZANIA
Dowd.
Jeli prosta p : y = ax przecina punkt (s, r), wtedy moemy zapisa rwnanie r = a s, czyli
a = rs . Zamy teraz, e r i s s wzgldnie pierwsze. Przypumy, e prosta p przecina punkt
kratowy w punkcie niebdcym postaci (kr, ks), niech bdzie to (a, b). Wtedy, jak powiedzielimy wczeniej, moemy j zapisa w postaci y = ab x, ab 6= rs , a zatem prosta postaci y = ab x nie
jest prost p.
Wemy teraz dowoln prost (p : y = rs x), gdzie r i s s wzgldnie pierwsze. Zauwamy,
e prosta p przecina guziki we wsprzdnych (s, r), (2s, 2r), (3s, 3r), ..., co powiedzielimy wcze0
niej.
teraz, e liczba przecinanych guzikw o wsprzdnych
j Zauwamy
k
j 0 k mniejszych ni n ,
n0
n
0
to max(r,s) , gdy wsprzdna x przekroczy n w punkcie bdcym s + 1 z kolei (bo x skaj 0k
cze co s), a wsprzdna y przekroczy n0 w punkcie bdcym nr + 1 z kolei (bo y skacze co r).
Zauwamy teraz, e prosta (p1 : y = rs x) przecina tyle samo punktw co prosta (p2 : y = rs x),
a przypadek gdy r = s wyeliminowalimy (zachodzi on wtedy gdy q = n), to moemy teraz
zaoy, e r > s, jeli bdziemy pamita, aby pomnoy wynik przez 2.
Chcemy, aby prosta p przecinaa guziki
j 0w
k dokadnie q miejscach. Zaoylimy, e r > s,
n
zatem interesuj nas takie r, dla ktrych r = q 0 . Bed to wszystkie liczby cakowite z prze0
dziau : ( q0n+1 , nq0 ], co atwo sprawdzi. Dla kadego r interesuj nas tylko takie s, e s < r
(co zaoylimy wyej) oraz s i r s wzgldnie pierwsze (gdy, jeli nie s, to istnieje wczeniejszy punkt przecinany przez p). Tak naprawd nie chcemy pozna wszystkich takich s, ale ich
liczb. Istnieje funkcja phi (wykad z teorii liczb), ktra dla danego x daje liczb liczb mniejszych od x i wzgldnie pierwszych z x. Zatem wynikiem bdzie suma phi(r) dla wszystkich
0
0
r z przedziau ( q0n+1 , nq0 ]. Warto powiedzie, e przy niektrych implementacjach rozkadanie
na czynniki kadej liczby moe by za wolne i mona skorzysta z wasnoci phi: Jeli a i b s
wzgldnie pierwsze, to phi(a b) = phi(a) phi(b). Moemy wykorzysta to do wyznaczania dla
kadej liczby z przedziau [2, n] jej phi za pomoc programowania dynamicznego (np. wydzielajc (by moe w potdze wikszej ni 1) zawsze jej najwikszy dzielnik pierwszy, ktry moemy
pozna z faktoryzacji).
158
ROZDZIA 9. ROZWIZANIA
Opracowanie: Pokoje
Dostpna pami: 32 MB
Dzie 3, 22.09.2010
Pokoje
Oznaczenia
Oznaczenia z treci zadania: h liczba pokoi w hotelu, n numer pokoju Pitusia. Przypomnijmy, e sufiks napisu s to napis zoony z ostatnich znakw s (by moe wszystkich).
Rozwizanie wzorcowe
W zadaniu musimy policzy, na ile sposobw moemy przestawi 6 i 9 w numerze pokoju, tak
aby numer pokoju pozosta mniejszy od numeru maksymalnego pokoju (czyli liczby wszystkich
pokoi).
Jeli dugo h jest wiksza ni dugo n, to rozwizaniem bdzie 2x , gdzie x to liczba 6 i 9
w numerze pokoju moemy w numerze pokoju zmienia 6 i 9 na dowolne sposoby.
Jeli dugo h jest mniejsza ni n, to rozwizaniem bdzie 0 aden numer pokoju nie jest
moliwy.
Pozostaje przypadek, gdy dugo h jest rwna dugoci n. Policzmy najpierw (liniowo)
wszystkie moliwe potgi 2k mod 9999997 dla k 6 dugo n.
Idmy znak po znaku w liczbie h (znak zh , h hotel) i liczbie n (znak zp , p pokj):
Jeli zp jest rny od 6 lub 9 wykonaj:
1. Jeli zh = zp , idziemy dalej i nic nie zmieniamy w aden sposb nie wpywa to na wynik.
2. Jeli zh < zp to wtedy zwracamy 0, gdy nawet najmniejsza moliwo pokoju z samymi
6 jest niemoliwa.
3. Jeli zh > zp , to wtedy wszystkie ustawienia dalej s moliwe, gdy nawet moliwo
pokoju z samymi 9 jest mniejsza od numeru maksymalnego pokoju. Zwracamy 2x , gdzie
x to liczba 6 i 9 w sufiksie zaczynajcym si od zp .
Jeli zp jest rwne 6 lub 9 wykonaj:
1. Jeli zh jest mniejsze od 6, to wtedy adne ustawienia dalej nie s moliwe, gdy nawet
wersja pokoju z samymi 6 jest niemoliwa, wic zwr 0.
2. Jeli zh jest rwne 6, to kontynuuj algorytm, gdy na danej pozycji w numerze pokoju
musi by 6.
3. Jeli zh jest z przedziau [7, 8], to zwr 2x , gdzie x to liczba 6 i 9 w sufiksie zaczynajcym
si od zp , bo wiemy, e na danej pozycji musi sta 6, ale take wiemy, e wszystkie moliwoci przestawie 6 i 9 na dalszych pozycjach dadz wynik mniejszy ni numer maksymalnego
pokoju.
4. Jeli zh jest rwne 9, to do wyniku dodaj 2x , gdzie x to liczba 6 i 9 w sufiksie zaczynajcym
si od zp , czyli przypu, e na danej pozycji stoi 6, wtedy wszystkie moliwoci przestawie
6 i 9 dalej s moliwe) oraz dodatkowo kontynuuj algorytm (postaw na danej pozycji 9).
Powyszy algorytm dziaa w czasie liniowym, gdy kady znak odwiedzimy tylko raz.
159
ROZDZIA 9. ROZWIZANIA
Dostpna pami: 64 MB
Dzie 3, 22.09.2010
Przyjazne punkty
Rozwizanie wzorcowe
Metod wymagan do rozwizania tego zadania bya technika Dziel i zwyciaj. Metoda
ta polega na rozwizaniu problemu wedug schematu:
1. Otrzymujemy pewien problem dla pewnych danych.
2. Jeeli dane s tak mae, e wynik dla nich jest ustalony lub prosty do obliczenia, to
zwracamy ten wynik; w przeciwnym wypadku:
3. Dzielimy podany problem na mniejsze podproblemy dla mniejszych danych (najczciej na
dwie rwne czci).
4. Liczymy wynik dla mniejszych czci.
5. Scalamy otrzymane wyniki, uzyskujc wynik dla pierwotnego problemu.
Przykadem algorytmu dziaajcego wg takiego schematu jest algorytm sortowania przez zczanie. Jeeli chcemy posortowa cig liczb, to dzielimy go na dwa rwne cigi, ktre sortujemy
rekurencyjnie, a nastpnie moemy w prosty sposb zczy dwa posortowane cigi, uzyskujc
jeden posortowany. W przypadku gdy cig, ktry chcemy posortowa, ma dugo 1, zwracamy
po prostu ten cig nie da si ju go podzieli.
Rozwizanie naszego zadania bdzie dziaao w nastpujcy sposb:
1. Dostajemy zbir punktw.
2. Jeeli do naszego zbioru naley jeden punkt, to zwracamy 0.
3. Dzielimy prost pionow podany zbir na dwa rwne zbiory.
4. Liczymy liczb par punktw przyjaznych w kadym z mniejszych zbiorw i dodajemy je
do wyniku.
5. Liczymy liczb par punktw przyjaznych, takich e jeden punkt jest w jednym zbiorze,
a drugi w drugim i dodajemy je do wyniku.
6. Zwracamy wynik.
W powyszym rozwizaniu jedyn niejasn rzecz do zrobienia moe by to, jak szybko policzy liczb par punktw przyjaznych, nalecych do rnych powek. Dalsza cz omwienia
bdzie temu powicona.
160
ROZDZIA 9. ROZWIZANIA
161
9.5
ROZDZIA 9. ROZWIZANIA
Dzie czwarty
Dostpna pami: 32 MB
Dzie 4, 23.09.2010
Dziwna planeta
Przedstawienie zadania
Problem zamaskowany w treci zadania jest nastpujcy:
Mamy trzy liczby binarne A, B, C (wszystkie o takiej samej dugoci n) i naszym zadaniem jest
obliczenie, ile jest liczb binarnych X o dugoci rwnej n, takich e liczba bitw ustawionych
na 1, liczb: AxorX, BxorX, CxorX jest sobie rwna (liczb bitw ustawionych na 1 dla XxorY
bdziemy nazywali odlegoci midzy X i Y ). Operacja xor dla dwch bitw zwraca 1, gdy s
rne oraz 0 gdy s takie same. Operacja xor dla dwch liczb binarnych A i B zwraca liczb
binarn C, tak e i-ty bit C jest xorem i-tego bitu A oraz i-tego bitu B. Tak wic za warto
i-tego bitu C odpowiadaj tylko i-ta warto A oraz i-ta warto B. Tak wic liczby A, B oraz
C z wejcia mona rozpatrywa jako trjki bitw z pozycji od 1 do n. Mamy 23 = 8 moliwych
trjek bitw:
1)
2)
3)
4)
5)
6)
7)
8)
A
0
0
0
0
1
1
1
1
B
0
0
1
1
0
0
1
1
C
0
1
0
1
0
1
0
1
1
1
2
1
1
Rozwizanie wolne
Moemy teraz opisa algorytm dziaajcy w zoonoci O(n8 log P ):
dla kadej z 8 rodzajw trjek okrelamy na ilu pozycjach z danej trjki w liczbie X umieszczamy
0, a na ilu 1. Powiedzmy, e liczebno kadej trjki wynosi Li oraz liczba bitw, na ktrych
umieszczamy jedynk, wynosi dla kadej trjki Ki . Otrzymujemy teraz pewien X, dla ktrego
162
ROZDZIA 9. ROZWIZANIA
tak naprawd nie wiemy dokadnie, na ktrej pozycji jest jaki bit, tylko wiemy dla kadego
rodzaju trjek, ile jest jedynek,
na miejscach zawierajcych t trjk. Do wyniku
a ile zer
L8
L2
L1
naley doda wic ( K1 K2 ... K8 ) (majc L pozycji i chcc postawi na K jedynki,
L
moemy to zrobi na K
sposobw oraz przyznawanie pozycji dla kadej trjki jest niezalene).
Szybkie obliczanie symbolu Newtona opiszemy pniej.
Rozwizanie szybsze
Aby polepszy powysze rozwizanie naley dokona kilku obserwacji. Jedn z nich jest
to, e tak naprawd trjka <0,0,0> jest taka sama jak <1,1,1>, <0,0,1> taka sama jak <1,1,0>,
<0,1,0> taka sama jak <1,0,1>, <0,1,1> taka sama jak <1,0,0>. Mona to tak traktowa, poniewa wybranie jedynki w np. <1,0,1> odpowiada wybraniu zera w <0,1,0> oraz na odwrt:
wybranie zera w np. <1,0,1> odpowiada wybraniu jedynki w <0,1,0>. Przeksztamy wic
<1,1,1> w <0,0,0>, <1,1,0> w <0,0,1>, <1,0,1> w <0,1,0> oraz <0,1,1> w <1,0,0>. Majc teraz 4 rodzaje trjek, moemy zastosowa rozwizanie takie jak dla 8 trjek i uzyskamy
rozwizanie O(n4 log P ).
Rozwizanie wzorcowe
Kolejn obserwacj prowadzc nas do rozwizania wzorcowego jest to, e niezalenie od tego,
jaki bit wybierzemy dla pozycji zawierajcej trjki <0,0,0>, to nie zmieni to rnic midzy
odlegociami pomidzy A i X, B i X oraz C i X. Tak wic moemy usun t trjk i kocowy
wynik przemnoy przez 2L1 , gdzie L1 jest liczb trjek <0,0,0>.
Moemy ponownie zastosowa pocztkowy algorytm, uzyskujc zoono O(N 3 log P ). Popatrzmy teraz na te trjki, ktre nam zostay:
<0,0,1>
<0,1,0>
<1,0,0>
Zamy, e kady bit X ustawilimy na 0, oraz e liczebno powyszych trjek jest kolejno
L1 , L2 , L3 .
Oznacza to, e odlego A od X wynosi L3 , B od X wynosi L2 oraz C od X to L1 .
W oglnym wypadku, jeeli Ki jest liczb pozycji i-tej trjki, ustawionych na jeden, to odlegoci
s nastpujce:
odl A od X = L3 - K3 + K2 + K1
odl B od X = L2 - K2 + K3 + K1
odl C od X = L1 - K1 + K3 + K2
Dymy do tego, aby te odlegoci byy sobie rwne. Aby tak byo, to nastpujce rwnanie
musi by spenione:
L3 - K3 + K2 + K1 = L2 - K2 + K3 + K1
L3 - K3 + K2 = L2 - K2 + K3
2 * K2 = L2 - L3 + 2 * K3
K2 = (L2 - L3 + 2 * K3) / 2
Wiemy, e L2 oraz L3 mamy ustalone, poniewa s to liczebnoci trjek, natomiast liczby K3
nie mamy ustalonej. Oznacza to, e jeeli ustalimy warto K3 , to aby odlegoci midzy A i X
oraz B i X byy rwne, to K2 musi by rwne L2L3+2K3
. Podobny wzr mona wyznaczy
2
dla liczebnoci K1 wzgldem K3 . Jeeli okae si, e K1 bd K2 s niecakowite, to oznacza
163
ROZDZIA 9. ROZWIZANIA
164
ROZDZIA 9. ROZWIZANIA
Opracowanie: Kupiec
Dostpna pami: 64 MB
Dzie 4, 23.09.2010
Kupiec
Rozwizanie wzorcowe
Rozwizanie wzorcowe opiera si na programowaniu dynamicznym. W rozwizaniu ukorzemy najpierw drzewo w dowolnym wierzchoku vk . Niech vw to dowolny wierzchoek w drzewie. Dla kadego wierzchoka chcemy znale dwie ponisze wartoci:
1. Wag jak najdroszej cieki zaczynajcej si i koczcej w poddrzewie vw . Nazwijmy j
wartoci pierwsz dla vw .
2. Wag jak najdroszej cieki zaczynajcej si w poddrzewie wyznaczanym przez vw , a koczc si na vw . Nazwijmy j wartoci drug dla vw .
Jeli vw jest liciem (wierzchokiem bez synw) to oczywistym jest, e obie te wartoci to 0.
Przypumy teraz, e dla wszystkich synw vw znamy obie te wartoci. Przypumy, e vs to
dowolny syn vw . Dla kadego syna vs dodajmy do jego wartoci drugiej wag krawdzi czcej
vw , oraz vs .
Warto druga dla vw to maksimum z 0 oraz wartoci drugiej dla kadego syna (ju po
dodaniu wagi krawdzi), gdy warto druga to albo pusta cieka (o wadze 0), albo cieka,
ktra idzie z vw przez ktrego z jego synw (dla ktrego mamy ju policzon optymaln warto
drug).
Warto pierwsza dla vw to max z:
1. 0, bo by moe nie istnieje warto dodatnia.
2. Wszystkich wartoci pierwszych dla kadego vs , gdy by moe cieka, dla ktrej wag jest
warto pierwsza, nie musi wcale przechodzi przez vw i by moe znalaza si w ktrym
z jego synw.
3. Suma najdroszej i drugiej najdroszej z kolei wartoci drugiej dla dwch rnych synw
vs . Jest to wersja, gdy najdrosza cieka, zaczynajca si i koczca si w poddrzewie
vw , zawiera wierzchoek vw . Wtedy od wierzchoka vw musz odchodzi dwie krawdzie
do dwch rnych synw. Chcemy, aby warto pierwsza dla vw bya jak najwiksza,
wic interesuj nas dwie najwiksze wartoci drugie jego synw.
Jeli znamy obie wartoci dla kadego wierzchoka, to wynikiem caego zadania bdzie warto
pierwsza dla wierzchoka vk , czyli wierzchoka, w ktrym ukorzenilimy cae drzewo, co wida
bez gbszego tumaczenia.
Rozwizanie bdne
Rozwizaniem, ktre niektre osoby mog uzna za prawidowe, a ktre jest bdne, jest
algorytm, ktry stosuje si przy szukaniu rednicy drzewa (wersja zadania, gdy wszystkie krawdzie maj nieujemn wag). Algorytm w skrcie polega na tym, e z dowolnego wierzchoka
vr znajdujemy jak najdalszy wierzchoek vn (za pomoc przeszukiwania grafu wszerz). Wtedy
wynikiem bdzie odlego od vn do jak najbardziej oddalonego od niego wierzchoka.
165
ROZDZIA 9. ROZWIZANIA
166
ROZDZIA 9. ROZWIZANIA
Dostpna pami: 64 MB
Dzie 4, 23.09.2010
Materiay wybuchowe
Wstp
Przyjmijmy takie oznaczenia jak w zadaniu, czyli n liczba ciarwek, k liczba materiaw
wybuchowych, y1 , ..., yk kolejne materiay wybuchowe, x1 , ..., xn kolejne ciarwki.
Optymalnym zapakowaniem ciarwki nazwiemy takie zapakowanie jej materiaami wybuchowymi, e jest szczelnie zapakowana oraz uyto jak najmniej materiaw wybuchowych.
Pierwsz rzecz, jak naley zrobi, jest posortowanie kolejnych wielkoci materiaw wybuchowych oraz usunicie powtrze. Zamy teraz, e (yi < yi+1 ).
Lemat.2. Naley zauway, e skoro yk 2 < xi (czyli e wielko kadej ciarwki jest wiksza od kwadratu najwikszego materiau wybuchowego), to jeli kada ciarwka zostaa optymalnie zapakowana, to znajduje si tam co najmniej jeden najwikszy materia wybuchowy(czyli yk ).
Dowd.
(Niekonieczny do zrozumienia rozwizania). Przypumy, e ciarwka nie posiada w optymalnym zapakowaniu adnego najwikszego materiau wybuchowego wielkoci yk . Niech ai to
liczno materiau wybuchowego yi w optymalnym zapakowaniu. Wiemy, e a1 y1 + a2 y2 +
... + ak1 yk 1 = xi , xi > yk 2 . Ponadto wiemy, e yi < yk dla i < k, zatem suma licznoci tych
materiaw z = a1 + a2 + ... + ak1 < yk . Wemy teraz cig zbiorw materiaw wybuchowych
U1 U2 ... Uz1 Uz , gdzie Ui = Ui1 + {yj }, gdzie yj to dowolny materia nalecy do
optymalnego rozwizania, a nienalecy do Ui1 . Ponadto Uz to zbir bdcy optymalnym zapakowaniem. Czyli innymi sowy U1 , ..., Uz to cig kolejnych zawierajcych si w sobie podzbiorw
optymalnego rozwizania, takich, e zaczynamy od zbioru mocy 1, a koczymy na zbiorze mocy
z. Zauwamy teraz, e jeli wemiemy dla kadego zbioru sum wielkoci jego materiaw wybuchowych modulo wielko najwikszego materiau wybuchowego (yk ), to z zasady szufladkowej
Dirichleta w cigu U1 , ..., Uz musz istnie dwa takie zbiory Ui oraz Uj , (i < j), e suma ich
elementw modulo yk jest taka sama (bo z > yk ). Wtedy zbir Uj \Ui ma sum elementw
modulo yk rwn 0 oraz jest niepusty. Zauwamy, e zbir Uj \Ui moemy zastpi zbiorem P
skadajcym si z samych materiaw wielkoci yk , takim e suma wielkoci jego materiaw wybuchowych bdzie taka sama jak zbioru Uj \Ui , jego liczno bdzie mniejsza, zatem dla naszego
rozwizania istnieje rozwizanie o mniejszej licznoci zatem sprzeczno.
Rozwizanie brutalne
Najprostsze rozwizanie polega na tym, e dla kadej ciarwki tworzymy tablic wielkoci
xi + 1 i za pomoc przeszukiwania wszerz szukamy jaka jest najtasza cieka idc od 0 do xi
za pomoc wszystkich materiaw wybuchowych. Zrozumienie i zakodowanie takiego rozwizanie nie powinno by problemem.
167
ROZDZIA 9. ROZWIZANIA
Rozwizanie wzorcowe
Rozwizanie wzorcowe jest ulepszeniem rozwizania brutalnego. W tym rozwizaniu zakadamy, e ciarwka zawsze zostanie wypeniona pewn liczb materiau yk . W rozwizaniu
najpierw zakadamy, e ciarwka xi jest wypeniona W = xi /yk materiaami wybuchowymi.
Niestety prawie zawsze zostaje nam jaka reszta R = xi mod yk . Dla danej reszty moemy
sprbowa BFSem (tak jak w sposobie brutalnym) wypeni j materiaami. Tak wypenion
tablic nazwijmy T1 . Nastpnie moemy doda na pocztek tablicy yk komrek (pozostae
zostawi niezmienione), w now pierwsz komrk wstawi warto 1 (bo o tyle wynik w
danej komrce bdzie si rni od W ) i prbowa z tej komrki puci BFS itd. (tablic po
jednym odjciu nazwijmy T2 ). Jeli bdziemy kolejno zabiera yk , wtedy w komrce yk + i
bdzie minimum z wartoci, jeli dopenilimy i elementw, zabralimy yk i dopenilimy yk + i
elementw, zabralimy 2 yk i dopenilimy 2 yk + i itd., ale istnieje lepszy sposb.
Teraz niech T3 to tablica T1 , do ktrej dodalimy na koniec yk komrek i kontynuowalimy
BFS, ktrego uylimy przy generowaniu T1 . Zauwamy, e w tablicy T2 ostatnie R komrek
to minimum z i-tej komrki T1 oraz i + yk -tej komrki T3 pomniejszonej o 1. Zauwamy teraz,
e interesuje nas tak naprawd tylko R ostatnich komrek tablicy T2 , a w tablicy T3 posiadamy
wystarczajc ilo informacji, aby je obliczy. Zatem zastpmy pierwsze R komrek tablicy
T3 przez ostatnie R komrek T2 . Teraz moemy zabra ostatnie R komrek T3 , gdy ju one
nas nie interesuj. Zauwamy, e wystarczyoby, jeli od razu tablica T3 miaaby wielko
yk , gdy jeli przekroczylibymy komrk yk , przypumy, e jestemy w komrce yk + p, to
wystarczyo, by aktualny wynik pomniejszony o 1 wpisa do komrki p. Zauwamy, e jeeli
w komrce nie zmieniamy wartoci (tzn. zostaa warto sprzed przekroczenia yk , to nie warto
dalej puszcza z niej BFSa). Jeli dalej bdziemy puszcza BFS-a po takiej tablicy w opisany
wyej sposb, to znajd si tam kolejno wartoci, jeli bymy dodali na pocztek T2 2yk i wpisali
2 w pierwsz komrk, 3yk i wpisali 3 w pierwsz komrk, itd., gdy bd to wartoci, ktre
osigniemy po kolejnych przekroczeniach komrki yk . Zawsze moemy odj yk od aktualnej
sumy klockw, co udowodnilimy wczeniej. Interesuje nas R-ta ju wygenerowanej tablicy T3 .
Warto powiedzie, e do generowania T3 lepiej uy algorytmu Dijkstry, gdy uywajc BFSa
bdziemy duo czciej poprawia komrki. Zauwamy, e mimo, i wyszlimy z tablic T3
dla jednej ciarwki, to tablica ta moe nam posuy przy generowaniu wyniku dla kolejnych
ciarwek. Wynik dla i-tej ciarwki to xi /yk + T3 [xi mod yk ].
168
ROZDZIA 9. ROZWIZANIA
9.6
Dzie pity
Dostpna pami: 64 MB
Dzie 5, 24.09.2010
f o r i :=1 to n do
b e s t := 0
f o r j :=1 to m
i f A[ i ] == B [ j ] then
S [ i ] [ j ] := S [ i 1 ] [ b e s t ] + 1
P [ i ] [ j ] := b e s t
else
S [ i ] [ j ] := S [ i 1 ] [ j ]
i f B [ j ] < A[ i ] and S [ i 1 ] [ j ] > S [ i 1 ] [ b e s t ] then
b e s t := j
169
ROZDZIA 9. ROZWIZANIA
Opracowanie: Bubu
Dostpna pami: 64 MB
Dzie 5, 24.09.2010
Bubu
Wana obserwacja
Obserwacj, dziki ktrej rozwizanie zadania staje si bardzo proste, jest to, e optymalna
strategia dla stranikw jest taka, e kady stranik idzie do Jaskini Bubu i czeka tam, a
do przybycia Bubu. Jest tak, gdy jeli stranicy potrafi w jaki sposb zablokowa drog
Bubu (stan na drodze Bubu przed jego przybyciem), to mog rwnie dobrze szybciej doj
do Jaskini.
Przypumy, e Bubu idzie najkrtsz ciek vl , vl1 , ..., v1 (gdzie v1 to jaskinia Bubu) do Jaskini. Wtedy aden stranik, jeli nie moe zapa Bubu w jaskini, to nie moe zapa Bubu
wczeniej. Jeli ktry ze stranikw moe zapa Bubu przed Jaskini (w ktrym z wierzchokw vi , i 6 n), to wtedy, jeli bdzie dalej szed t sciek to bdzie w jaskini wczeniej niz
Bubu.
Przypumy, e Bubu nie bdzie szed najkrtsz ciek. Jeli stranik ma dalej do Jaskini
ni Bubu, to Bubu, aby uciec danemu stranikowi, moe pj najkrtsz ciek. Jeli stranik
ma bliej do Jaskini, to moe zapa Bubu w Jaskini.
Rozwizanie wzorcowe
W rozwizaniu wzorcowym obliczamy dla kadego wierzchoka vi najkrtsz ciek z vi
do wierzchoka v1 (jaskini Bubu). Wykorzystujemy do tego algorytm Dijkstry z wierzchokiem
startowym v1 (gdy najkrtsza cieka z vi do v1 ma tak sam dugo, jak cieka z v1 do vi ,
bo graf jest nieskierowany). Jeli ktry stranik stoi na wierzchoku bliej Jaskinii ni Bubu,
to odpowiedzi jest -1, w przeciwnym wypadku odlego Bubu od Jaskini.
170
ROZDZIA 9. ROZWIZANIA
Opracowanie: Myszka
Dostpna pami: 64 MB
Dzie 5, 24.09.2010
Myszka
Wstp
W treci mamy myszk, labirynt z pokojami i korytarzami, serek w pokojach, szerokoci
korytarzy oraz pytanie o maksymaln wag myszki, tak aby udao si jej wydosta z labiryntu.
Nie jest jakim trudnym spostrzeeniem, e mamy tutaj graf nieskierowany z wagami w wierzchokach oraz krawdziach. Tak wic przy omawianiu rozwizania tego zadania bdziemy si
posugiwali terminami znanymi z teorii grafw. Bdziemy rwnie naprzemiennie uywali okrelenia waga myszki oraz grubo myszki.
ROZDZIA 9. ROZWIZANIA
172
Rozdzia 10
Wykady
10.1
Teoria liczb II
10.1.1
p
q
p
p0
=q
q
q0
= p mod q
xp
x0p
= xq
yp
yp0
= yq
x0q
xq j k
= xp pq xq
yq0
yq j k
= yp pq yq
Warto q zostaje przepisana jako nowe p, wedug wasnoci nwd(p, q) = nwd(q, p mod q).
W zwizku z tym, przepisane zostaj rwnie liczby xq i yq .
173
10.1.2
q
xq = 0, yq = 1
q=7
xq = 1, yq = 1
q=4
xq = 1, yq = 2
q=3
xq = 2, yq = 3
q=1
xq = 7, yq = 11
q=0
W tej czci zajmiemy si rozwizywaniem rwna postaci ax + by = c, dla dowolnego c. Rwnanie takie ma 0 lub nieskoczenie wiele rozwiza. Zaley nam na znalezieniu dowolnego
maego rozwizania, takiego rwnania lub stwierdzenia, e takie rozwizanie nie istnieje. Niech
d = nwd(a, b).
Lemat.3. Rwnanie ax + by = c ma rozwizanie wtedy i tylko wtedy, kiedy d|c.
Dlaczego? Jeeli c nie jest podzielne przez d, to ax + by jest podzielne przez d, a c nie.
Rwnanie takie nie moe wic mie rozwiza.
Jeeli d|c to z rozszerzonego algorytmu Euklidesa moemy otrzyma liczby x1 , y1 , takie e
d = ax1 + by1 . Mnoc stronami przez dc , otrzymujemy c = a xd1 c + b yd1 c . Zatem istnieje
rozwizanie rwnania.
Jednak takie rozwizanie nas nie satysfakcjonuje, gdy otrzymane wartoci x i y mog by
kwadratowo due ze wzgldu na liczby a, b, c. Algorytm, ktry tutaj zastosujemy, bdzie nieznaczn modyfikacj wyej podanego, rozszerzonego algorytmu Euklidesa. Zauwamy, e majc
rozwiza rwnanie ax + by = n oraz majc dane liczby xq , yq , takie e q = axq + byq , moemy uproci rwnanie ax + by = n, odejmujc od niego, najwiksz wielokrotno
j k rwnania
q = axq + byq . Niech k bdzie najwiksz tak liczb, e kq 6 n. Zatem k = nq . Wwczas
rwnanie, ktre mamy rozwiza, upraszcza si do postaci ax+by = nkq. Jeeli rozwiemy to
rwnanie i dodamy do niego stronami kaxq + kbyq = kq, otrzymamy rozwizanie pocztkowego
rwnania. W ten sposb bdziemy zmniejsza n, dopki n > 0. Przyjrzyjmy si temu na przykadzie. Niech a = 11, b = 7, c = 24. Rwnanie ma wic posta 11x + 7y = 24. W pierwszym
wywoaniu zachodzi p = a, q = b, n = c.
p
xp = 1, yp = 0
p = 11
xp = 0, yp = 1
p=7
xp = 1, yp = 1
p=4
xp = 1, yp = 2
p=3
q
xq = 0, yq = 1
q=7
xq = 1, yq = 1
q=4
xq = 1, yq = 2
q=3
xq = 2, yq = 3
q=1
Najwiksze k, takie, e kq 6 n
n = 24
n=3
k = 0, kq = 0, x = kxq = 0, y = kyq = 0
n=3
k = 1, kq = 3, x = kxq = 1, y = kyq = 2
n=0
k = 0, kq = 0, x = kxq = 0, y = kyq = 0
10.1.3
7
6
b
5
4
y = 54 x
3
b
x=n
2
1
6 5 4 3 2 1
1
10 11 12 13 14
wszystkie pozostae punkty maj posta (lb, la). Zatem liczba punktw kratowych w trjkcie 4ABF , to (ka+1)(kb+1)+(k+1)
. Przy czym nie liczymy punktw na osi OX, wic zostaje
2
(ka+1)(kb+1)+(k+1)
(kb + 1) punktw. Liczba punktw w prostokcie BCDF to prosty iloczyn,
2
jednak naley zwrci uwag, aby nie policzy punktw na odcinku BF , bo te ju policzylimy,
zliczjc punkty dla trjkta ABF . Pozosta trjkt F DE, dla ktrego wywoamy algorytm
rekurencyjnie. W ten sposb problem dla (n, a, b) sprowadzilimy do problemu dla (r, a, b), czyli
(n mod b, a, b).
8
b
7
6
b
5
4
3
ka
2
1
b
kb
1
1
r
9
C
10 11
b
12
13
n
X
(kb + r)i
n
X
kbi
X
n
n
n
n
n
X
X
X
X
ri
ri
ri
ri
=
=
+
=
)=
=k
(ki+
ki+
i+
b
b
b
b
b
b
b
i=0
i=0
i=0
i=0
i=0
i=0
i=0
i=0
(10.2)
Przy trzecim przeksztaceniu ki moemy wycign przed podog, poniewa jest to liczba cakowita.P
Suma ni=0 i to sumaPliczb od 0 do n i jest rwna n(n+1)
.
2
Zauwamy, e suma ni=0 rib jest sum takiej samej postaci, jak ta, ktr mielimy policzy,
tylko ze zmniejszonym argumentem a. Udao nam si zatem sprowadzi problem dla (n, a, b)
do problemu z (n, r, b), czyli (n, a mod b, b).
176
5 D
b
4
3
2
1
b
n
1
5B
10
11
10.1.4
W tym roku, na obozie ONTAK pojawio si zadanie Trzsienie Ziemi o nastpujcej treci.
Zadanie. Dla danych liczb A, B, C(A, B 6 109 , C 6 min(A, B) 109 ) obliczy liczb punktw
kratowych ograniczonych osiami ukadu wsprzdnych oraz prost Ax + By = C.
Gdyby punkt przecicia prostej Ax + By = C oraz osi Xw mia wsprzdne cakowite,
to mogilbymy bezporednio policzy liczb punktw kratowych w trjkcie za pomoc metody
podanej w punkcie 3. W wikszoci przypadkw tak jednak nie jest.
Zauwamy, e prost Ax+By = C moemy interpretowa jako liniowe rwnanie diofantyczne,
ktrego rozwizaniami s punkty kratowe lecej na tej prostej. Jeeli zatem nwd(A, B) nie
177
dzieli C to na prostej nie ley aden punkt kratowy. Niech C 0 bdzie najwiksz wielokrotnoci
nwd(A, B), mniejsz od C. Proste Ax + By = C, oraz Ax + By = C 0 s rwnolege oraz
w obszarsze pomidy tymi prostymi nie le adne punkty kratowe. Dlaczego? Gdyby pomidzy
prostymi Ax + By = C i Ax + By = C 0 lea jaki punkt kratowy, to w szczeglnoci leaby
na pewnej prostej Ax + By = D, rwnolegej do prostej Ax + By = C. Wwczas D > C 0 oraz
D < C, wic nwd(A, B) nie dzieli D. Zatem na prostej Ax+By = D nie moe lee aden punkt
kratowy. Uzyskana sprzeczno dowodzi, e pomidzy prostymi Ax + By = C i Ax + By = C 0
nie ley aden punkt kratowy.
W przykadzie na rysunku mamy A = 5, B = 10, C = 8, C 0 = 5.
5x + 10y = 8
5x + 10y = 5
4
Poniewa pomidzy prostymi Ax+By = C oraz Ax+By = C 0 nie ley aden punkt kratowy,
wic rozwizanie dla tych dwch prostych jest takie samo. Bdziemy zatem szuka rozwizania
dla prostej Ax + By = C 0 . Poniewa nwd(A, B)|C 0 , to moemy za pomoc algorytmu z punktu
2 znale dowolny punkt kratowy lecy na tej prostej. Niech punkt ten ma wsprzdne (x, y).
Punkt (x+B, y A), rwnie ley na tej prostej. Oglniej, na prostej ley punkt (x+kB, y kA)
dla kadego k. Moemy atwo znale odpowiednio due k, dla ktrego y kA 6 0. W ten
sposb otrzymujemy punkt F . Zauwamy, e liczb punktw kratowych w trjkcie HLG
moemy policzy, obliczajc liczb punktw kratowych w trjkcie EF G i odejmujc ich liczb
w prostokcie EKL0 H i trjkcie K 0 F L. Liczb punktw kratowych w prostokcie, to (|L0 K| +
1) (|EK| + 1). Liczb punktw katowych w trjkcie EF G obliczamy algorytmem z punktu
3 dla n = |EF |, a = A, b = B. Podobnie, liczb punktw w trjkcie K 0 F L moemy policzy
algorytmem z punktu 3, dla n = |LK 0 |, a = B, b = A. Zauwamy, e w tym przypadku, musimy
tak jakby obrci ten trjkt, aby odcinek |LK 0 | by w podstawie. Robimy to dlatego, e dugo
odcinka |F K 0 | moe nie by cakowita. W ten sposb otrzymujemy ostateczne rozwizanie.
6
5
b
4
3
6x + 8y = 38
2
1
b
H 1
7 6 5 4 3 2 1
1
2
b
178
5 L 6 L7
9
b
10
11
12
Bibliografia
[1] P. Staczyk. Algorytmika praktyczna. PWN, Warszawa, 2009.
[2] L. Banachowski, K. Diks, W. Rytter. Algorytmy i struktury danych. WNT, Warszawa, 1996.
[3] T. H. Cormen, C. E. Leiseron, R. L. Rivest. Wprowadzenie do algorytmw. WNT, Warszawa,
1997.
[4] W. Lipski. Kombinatoryka dla programistw. WNT, Warszawa, 2004.
[5] Ronald L. Graham, Donald E. Knuth, Oren Patashnik. Matematyka konkretna. PWN, Warszawa, 1996.
[6] http://wazniak.mimuw.edu.pl.
[7] http://oi.edu.pl.
179