Лекция по информатике 1
Вид материала | Лекция |
- Учебно-методический комплекс курса по выбору "задачи егэ по информатике" (физико-математический, 704.64kb.
- Рабочая программа по информатике в 5 классе на 2010-2011 учебный год, 228.89kb.
- Обучение информатике во II-IV классах рекомендуется проводить учителям начальной школы, 112.11kb.
- Программа работы с одаренными детьми по информатике--халанская С. М. Программа по информатике, 128.21kb.
- Общие принципы и подходы к обучению информатике, 160.44kb.
- Сложность проведения егэ по информатике обусловлена спецификой предмета, его практической, 66.95kb.
- Календарно-тематический план по информатике 9 класс 2010-2011 учебный год, 465.74kb.
- Подготовка студентов педвузов по социальной информатике в условиях информатизации образования, 327.22kb.
- «Социальная стратификация и социальная мобильность», 46.19kb.
- Рабочая программа элективного курса по информатике «Приёмы решения нестандартных задач, 219.89kb.
Лекция по информатике 1.
Учитывая специфику международных олимпиад по информатике, от ее участников требуется знание различных алгоритмов. Этих алгоритмов достаточно много, поэтому сначала рассмотрим самые основные из них. Также рассмотрим задачи на эти темы и возможные методы их решения.
Полный перебор.
При решении задач этим методом используется принцип "делать просто, глупо". Основная цель при решении олимпиадных задач - написать программу, которая работает в течение отведенного времени, используя любой алгоритм.
Полный перебор использует следующий метод нахождения ответа: перебрать все возможные варианты, и выбрать из них наилучший. Этот метод должен всегда рассматриваться первым. Если он работает при максимальных тестах в отведенное время, то программируйте именно его: его легко набрать и достаточно легко отладить. Это означает, что у вас будет больше времени на более сложные задачи, где полный перебор работает медленно.
Иногда требуется несколько уточнить задачу, для того чтобы полный перебор работал в отведенное время.
Рассмотрим примеры задач, которые можно решить этим методом.
Задача 1: Party lamps [IOI 98]
Вам дано N ламп и четыре переключателя. Первый переключатель изменяет состояние у всех ламп (с «включено» на «выключено» – и наоборот), второй - четные лампы, третий - нечетные лампы, и последний – изменяет состояние у ламп с номерами 1, 4, 7, 10, ... 3k+1.
Дано количество ламп: N, количество сделанных переключений (до 10,000), и состояние некоторых ламп (например, lamp 7 is off), выведите все возможные состояния ламп.
Самое просторе решение: для каждого переключения, мы должны рассмотреть 4 возможных исхода, всего 410000 (примерно 106020), что означает, что нельзя решить данную задачу полным перебором (этот особенный алгоритм будет очень долгим).
Заметим, что очередность нажатий не имеет значения. Видим что количество переключений свелось к 100004 (примерно 1016 ), все еще много для полного перебора (но значительно меньше чем 106000 ).
Нажатие одного и того же переключателя дважды равносильно ни одному нажатию, т.е. всего необходимо проверить нажатие каждого переключателя 0 или 1 раз. Это всего 24 = 16 вариантов, то есть решение укладывается во время, отведенное для проверки.
Перечислим тесты к этой задаче, которые использовались на международной олимпиаде.
В первой строке указывается количество ламп – N, во второй – количество сделанных переключений. В третьей – номера ламп, которые после завершения переключений включены (список заканчивается числом -1). В четвертой – номера ламп, которые после завершения переключений выключены (список также заканчивается -1)
Требуется вывести все возможные заключительные состояния ламп в «алфавитном» порядке, или IMPOSSIBLE, если такого состояния не существует.
------- input 1 -------
10
0
-1
-1
------- output 1 ------
1111111111
------- input 2 -------
10
0
-1
1 -1
------- output 2 ------
IMPOSSIBLE
------- input 3 -------
20
3
-1
1 3 5 -1
------- output 3 ------
00000000000000000000
01010101010101010101
------- input 4 -------
50
100
1 -1
-1
------- output 4 ------
10010010010010010010010010010010010010010010010010
10101010101010101010101010101010101010101010101010
11000111000111000111000111000111000111000111000111
11111111111111111111111111111111111111111111111111
------- input 5 -------
75
250
-1
-1
------- output 5 ------
000000000000000000000000000000000000000000000000000000000000000000000000000
001110001110001110001110001110001110001110001110001110001110001110001110001
010101010101010101010101010101010101010101010101010101010101010101010101010
011011011011011011011011011011011011011011011011011011011011011011011011011
100100100100100100100100100100100100100100100100100100100100100100100100100
101010101010101010101010101010101010101010101010101010101010101010101010101
110001110001110001110001110001110001110001110001110001110001110001110001110
111111111111111111111111111111111111111111111111111111111111111111111111111
------- input 6 -------
100
8394
1 7 13 19 25 31 37 43 49 55 -1
64 -1
------- output 6 ------
1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010
1100011100011100011100011100011100011100011100011100011100011100011100011100011100011100011100011100
------- input 7 -------
100
2000
31 86 23 -1
42 -1
------- output 7 ------
IMPOSSIBLE
------- input 8 -------
100
8950
-1
-1
------- output 8 ------
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0011100011100011100011100011100011100011100011100011100011100011100011100011100011100011100011100011
0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101
0110110110110110110110110110110110110110110110110110110110110110110110110110110110110110110110110110
1001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001
1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010
1100011100011100011100011100011100011100011100011100011100011100011100011100011100011100011100011100
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
----------------------
Задача 2. Квадрат
Имя входного файла: | input.txt |
Имя выходного файла: | output.txt |
Рассмотрим целочисленную решетку размера N × N. Пусть некоторые ее узлы покрашены в белый, а некоторые - в черный цвет. Требуется определить количество квадратов на заданной решетке, то есть квадратов, вершины которых совпадают с узлами заданной решетки и покрашены в одинаковый цвет.
Например, на решетке размера 4 × 4, изображенной на рисунке 1, таких квадратов три, они показаны на рисунке 2.
Формат входных данных
Первая строка входного файла содержит число N - размер решетки (2 < N < 50). Следующие N строк содержат по N символов из множества {"0", "1"} и задают решетку. Если точка с координатами (i, j) покрашена в белый цвет, то j-ый символ i-ой строки равен "0", а если в черный, то "1".
Формат выходных данных
Выведите в выходной файл количество квадратов на решетке из входного файла.
Пример
input.txt | output.txt |
4 0100 0001 1000 0110 | 3 |
Задача 3. Сломанные бусы [IOI 93]
Имеются бусы, состоящие из N бусинок (3<=N<=350), некоторые из которых красного или желтого цвета, а остальные – прозрачные. Здесь приведено два примера при N=29:
1 2 1 2
r y y r y r r y
r y y y
r r y r
r r t r
y r t t
y y r r
y y y y
y y r y
r r y r
y r r r
y r r r
r r r y
r y r r r t
Фигура A Фигура B
r красная бусинка
y желтая бусинка
t белая бусинка
На рисунках цифрами отмечены позиции первой и второй бусинок.
Конфигурация бус задается последовательностью цветов бусинок ("y" - желтая, "r" - красная, "t" - прозрачная), начиная с бусинки 1. Например, бусы на фигуре А, задаются последовательностью: yryrrryyyrrrrryrryyryyyyrrrry .
Порвем бусы и затем начнем снимать бусинки одного цвета с первого конца, пока не встретится бусинка другого цвета. То же самое проделаем со вторым концом (бусинки, снятые с разных концов могут быть разного цвета).
Требуется определить точку такого разрыва данных бус, при котором суммарное количество бусинок, собранных с обоих концов, максимально
Например
Например, для бус, изображенных на фигуре 1, точка разрыва может находиться между 24 и 25 бусинками или между 9 и 10 бусинками; при этом суммарное количество бусинок в обоих случаях равняется 8.
При снятии бусинок с каждого из концов прозрачная бусинка может рассматриваться как бусинка желтого или красного цвета по ситуации, т.е. может сниматься как с желтыми, так и с красными бусинками. Строка, представляющая конфигурацию бус, будет включать только 3 символа: r, y и t.
Напишите программу, определяющую максимальное число собранных бусинок.
Входные данные
1 строка: | N, количество бусинок |
2 строка: | Строка из N символов, каждый из которых r, y, или t |
Пример входных данных (файл input.txt)
29
tttyyrtryryrryryrtrttrytrtrry
Выходные данные
1 строка, содержащая максимальное количество собранных бусинок.
Пример выходных данных (файл output.txt)
11
Обход в глубину.
Рассмотрим стандартную задачу про n ферзей
Расположить n ферзей на шахматной доске nxn, так чтобы они не атаковали друг друга.
Поиск в глубину
Наиболее очевидное решение состоит в том, чтобы ставить ферзей рекурсивно на доску, пробуя все возможные способы размещения ферзя. Легко использовать тот факт, что каждый ферзь должен стоять на отдельной вертикали: на каждом шаге рекурсии, мы ищем только номер вертикали, куда можно поставить ферзя.
1 search(col)
2 если заполнены все вертикали
3 print solution and exit
4 для каждой позиции на диагонали col
5 если позиция board(row, col) не атакована
6 поставить ферзя на (row, col)
7 search(col+1)
8 убрать ферзя с (row, col)
Вызов search (0) начинает процедуру поиска. Он работает быстро, т.к. на очередном шаге расстановки ферзя, число неатакованных полей резко уменьшается.
Это - пример поиска в глубину. Алгоритм проходит все дерево решений сверху вниз до основания настолько быстро, насколько это возможно: поставив один раз k ферзей на доску, следующие ферзи будут располагаться, начиная с этой расстановки.
Поиск в глубину проверяет каждый узел в дереве поиска на выполнение некоторого свойства. Дерево поиска напоминает этот рисунок:
Алгоритм проходит дерево, идя вниз настолько, насколько это возможно, а затем возвращается назад (отходя на предыдущую вершину), делая своего рода схему дерева, поскольку некоторые узлы посещены. Дерево поиска может быть проиллюстрировано следующим образом:
Задача 4: Ферзи (стандартная)
Требуется расставить N (6<=N<=13) ферзей на доске NxN таким образом, чтобы они не били друг друга. В выходной файл (output.txt) требуется вывести количество возможных расстановок.
В первой строке входного файла (input.txt) записано число N.
Тесты:
input.txt | output.txt |
6 | 4 |
7 | 40 |
8 | 92 |
9 | 352 |
10 | 724 |
11 | 2680 |
12 | 14200 |
13 | 73712 |
Задача 5: Суперпростое число
Рассмотрим простое число 7331.
Число 733, которое получено вычеркиванием последней цифры из этого числа также является простым.
Далее, число 73, которое получено вычеркиванием двух последних цифр из числа также является простым.
А также число 7, полученное вычеркиванием последних трех цифр, является простым.
Поэтому число 7331 назовем суперпростым.
Далее, обобщим это определение. Простое число X назовем суперпростым, если число, полученное вычеркиванием k цифр из X, также является простым (0
Требуется по заданному числу N распечатать все суперпростые числа, которые имеют длину в N цифр. 1<=N<=8
Например:
input.txt
4
output.txt
2333
2339
2393
2399
2939
3119
3137
3733
3739
3793
3797
5939
7193
7331
7333
7393
Сортировка.
Здесь я просто приведу алгоритм быстрой сортировки, реализованной на Паскале. Эта сортировка имеет сложность O(NlogN).
const nmax=10000;
var
infile,outF:Text;
n:integer;
a:array[1..nmax]of integer;
procedure qs(l,r:integer);
var i,j:integer;
x,t:integer;
begin
i:=l;
j:=r;
x:=a[(l+r)div 2];
repeat
while a[i]
while x
if i<=j then
begin
t:=a[i]; a[i]:=a[j]; a[j]:=t;
inc(i); dec(j); end;
until i>j;
if l
if l
end;
procedure Load_Process;
var i:integer;
begin
Assign(infile,'qsort.in');
Assign(outF,'qsort.out');
Reset(infile);
readln(infile,n);
for i:=1 to n do readln(infile,a[i]);
close(infile);
qs(1,n);
Rewrite(outF);
for i:=1 to n do writeln(outF,a[i]);
close(outF);
end;
begin
Load_Process;
end.
Задача 6: Сортировка векторов.
Вектор – это упорядоченный набор из N ( 0 Входной файл: (input.txt)
Первая строка содержит 2 числа – K и N.
Далее идет K строк, по N целых чисел в каждой – описание векторов.
Выходной файл: (output.txt)
Требуется вывести упорядоченный по возрастанию набор исходных K векторов.
Пример
input.txt
output.txt
5 5
1 2 3 4 5
2 -1 3 0 0
1 0 2 1 8
-1 2 3 7 1
1 2 3 5 6
-1 2 3 7 1
1 0 2 1 8
1 2 3 4 5
1 2 3 5 6
2 -1 3 00
Лекция по информатике 2.
Эта лекция является продолжением первой лекции. В ней будут рассмотрены новые темы, а также приведены задачи на них.
Теория графов.
Определим граф как конечное множество вершин V и набор E неупорядоченных и упорядоченных пар вершин и обозначим G=(V,E). Мощности множеств V и E будем обозначать буквами N и M. Неупорядоченная пара вершин называется ребром, а упорядоченная пара - дугой. Граф, содержащий только ребра, называется неориентированным; граф, содержащий только дуги, - ориентированным, или орграфом. Вершины, соединенные ребром, называются смежными. Ребра, имеющие общую вершину, также называются смежными. Ребро и любая из его двух вершин называются инцидентными. Говорят, что ребро (u, v) соединяет вершины u и v. Каждый граф можно представить на плоскости множеством точек, соответствующих вершинам, которые соединены линиями, соответствующими ребрам. Граф называется связным, ели из любой вершины u можно попасть в любую другую вершину v.
Способы описания. Выбор соответствующей структуры данных для представления графа имеет принципиальное значение при разработке эффективных алгоритмов. При решении задач используются следующие четыре основных способа описания графа: матрица инциденций; матрица смежности; списки связи и перечни ребер. Мы будем использовать только два: матрицу смежности и перечень ребер.
Матрица смежности - это двумерный массив размерности N*N.
A[i,j]=
Для хранения перечня ребер необходим двумерный массив R
размерности M*2. Строка массива описывает ребро.
Входной файл: (input.txt)
Первая строка содержит 2 числа – K и N.
Далее идет K строк, по N целых чисел в каждой – описание векторов.
Выходной файл: (output.txt)
Требуется вывести упорядоченный по возрастанию набор исходных K векторов.
Пример
input.txt | output.txt |
5 51 2 3 4 52 -1 3 0 01 0 2 1 8-1 2 3 7 11 2 3 5 6 | -1 2 3 7 11 0 2 1 81 2 3 4 51 2 3 5 62 -1 3 00 |
Лекция по информатике 2.
Эта лекция является продолжением первой лекции. В ней будут рассмотрены новые темы, а также приведены задачи на них.
Теория графов.
Определим граф как конечное множество вершин V и набор E неупорядоченных и упорядоченных пар вершин и обозначим G=(V,E). Мощности множеств V и E будем обозначать буквами N и M. Неупорядоченная пара вершин называется ребром, а упорядоченная пара - дугой. Граф, содержащий только ребра, называется неориентированным; граф, содержащий только дуги, - ориентированным, или орграфом. Вершины, соединенные ребром, называются смежными. Ребра, имеющие общую вершину, также называются смежными. Ребро и любая из его двух вершин называются инцидентными. Говорят, что ребро (u, v) соединяет вершины u и v. Каждый граф можно представить на плоскости множеством точек, соответствующих вершинам, которые соединены линиями, соответствующими ребрам. Граф называется связным, ели из любой вершины u можно попасть в любую другую вершину v.
Способы описания. Выбор соответствующей структуры данных для представления графа имеет принципиальное значение при разработке эффективных алгоритмов. При решении задач используются следующие четыре основных способа описания графа: матрица инциденций; матрица смежности; списки связи и перечни ребер. Мы будем использовать только два: матрицу смежности и перечень ребер.
Матрица смежности - это двумерный массив размерности N*N.
A[i,j]=
Для хранения перечня ребер необходим двумерный массив R
размерности M*2. Строка массива описывает ребро.