6-zanjatie525655f961bc4

реклама
Дистанционная подготовка к
Всероссийской олимпиаде по
информатике
Преподаватели:
к.ф.-м.н., заведующий кафедрой «САПР» ДВГУПС
Пономарчук Юлия Викторовна
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");
Бинарный (двоичный) поиск
для монотонных функций
Поиск может использоваться для поиска корней уравнений и
значений монотонных функций (убывающих или возрастающих).
Пример: вычислить кубический корень с заданной точностью, т.е.
m3 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
Скачать