Дистанционная подготовка к Всероссийской олимпиаде по информатике Преподаватели: к.ф.-м.н., заведующий кафедрой «САПР» ДВГУПС Пономарчук Юлия Викторовна E-mail: yulia.ponomarchuk@gmail.com преподаватель кафедры «САПР» ДВГУПС Сухобок Юрий Андреевич E-mail: khvyus@gmail.com Занятие 5. Бинарный поиск Линейный поиск в неупорядоченных массивах j := 1; for i := 1 to n do if a[i] = k then j := i; Сложность алгоритма – О(N) Бинарный (двоичный) поиск в упорядоченных массивах Основная идея: Имеется заданная своими границами область поиска. Выбираем ее середину. Если искомый элемент меньше, чем средний, то поиск осуществляется в левой части, иначе – в правой. Сложность алгоритма – O(log N) while (l<r) do begin m := (l+r) div 2; if (a[m]<k) then l := m+1 else r :=m; end; if (a[r] = k) then write(r) else write("-1"); Бинарный (двоичный) поиск для монотонных функций Поиск может использоваться для поиска корней уравнений и значений монотонных функций (убывающих или возрастающих). Пример: вычислить кубический корень с заданной точностью, т.е. m3 x найти r := x; l := 1; while (abs(l-r)>eps) do begin m := (l+r) div 2; if (m*m*m<x) then l := m else r := m; end; Поиск порядковых статистик k-ая порядковая статистика – k-ый по счету элемент массива (т.е. если массив отсортирован по неубыванию, то k-ая порядковая статистика – это элемент, стоящий на k-ой позиции) Схема алгоритма: a – исходный массив (неотсортированный) k – номер искомой порядковой статистики l, r – текущая левая и правая границы области Если l=r, то область поиска ограничена одним элементом, т.е. k-я порядковая статистика равна a[r] Поиск порядковых статистик • На каждом шаге выбираем число s = (l+r)/2 • Расположим элементы массива из интервала [l, r] так, чтобы сначала шли все элементы, меньшие a[s], а затем все остальные • Первый элемент второй группы обозначим за j • Если k≤j, то продолжаем поиск в левой части массива (с неизменным значением l и r=j) Иначе продолжаем поиск в правой части массива (с неизменным значением r и l=j) Поиск порядковых статистик procedure search(var a : our_array; k, l, r : integer); var s, m, i, j, tmp : integer; begin i := l; j := r; if (l = r) then search := a[r] else begin s := (l + r) div 2; m := a[s]; while (i < j) do begin while (a[i] < m) do inc(i); while (a[j] > m) do dec (j); if (i < j) then begin tmp := a[i]; a[i] := a[j]; a[j] := tmp; inc(i); dec(j); end; end; if (k < j) then search(a, k, l, j) else search(a, k, i, r); end; end; Очень легкая задача Сегодня утром жюри решило добавить в вариант олимпиады еще одну, Очень Легкую Задачу. Ответственный секретарь Оргкомитета напечатал ее условие в одном экземпляре, и теперь ему нужно до начала олимпиады успеть сделать еще N копий. В его распоряжении имеется два ксерокса, один из которых копирует лист за x секунд, а другой – за y. (Разрешается использовать как один ксерокс, так и оба одновременно. Можно копировать не только с оригинала, но и с копии). Помогите выяснить, какое минимальное время в секундах для этого потребуется. 1 ≤ N ≤ 2*108, 1 ≤ x,y ≤ 10 Очень легкая задача • Первую страницу копируем за min(x,y) рассматриваем решение для N-1 страницы секунд и затем • Пусть l – минимальное время, r – максимальное. Минимум – 0 секунд, максимум – (N-1)*x секунд (если страницы делаются полностью на одном ксероксе). • Считаем текущее среднее значение (l+r)/2 и смотрим, сколько полных страниц можно напечатать за это время, используя оба ксерокса. • Если количество страниц меньше N-1, то меняем нижнюю границу, иначе – верхнюю. Автобус Служебный автобус совершает один рейс по установленному маршруту и в случае наличия свободных мест подбирает рабочих, которые ожидают на остановках, и отвозит их на завод. Автобус также может ждать на остановке рабочих, которые еще не пришли. Известно время прихода каждого рабочего на свою остановку и время проезда автобуса от каждой остановки до следующей. Автобус приходит на первую остановке в момент времени t = 0. Продолжительность посадки рабочих в автобус считается нулевой. Определите минимальное время, за которое автобус подвезет максимально возможное количество рабочих. Известно: количество остановок (N), количество мест в автобусе (M), время движения между остановками, количество рабочих на каждой остановке Ki, время прихода каждого рабочего на остановку. 1 ≤ M ≤ 2000, 1 ≤ N, K ≤ 200000