В неубывающей последовательности (положительных) целых двух элементов можно удалить при . Сколько пар может быть удалено не более из этой последовательности?
Итак, я подумал о следующем решении:
- Я беру заданную последовательность и делясь на две части (первая и вторая).
- Назначьте каждому из них итератор - it_first: = 0 и it_second: = 0 соответственно. count: = 0
- когда it_second!= second.length
- если 2 * сначала [it_first] <= second [it_second]
- count ++, it_first ++, it_second ++
- еще
- it_second ++
- если 2 * сначала [it_first] <= second [it_second]
- count - это ответ
Пример:
count: = 0
[1,5,8,10,12,13,15,24] → first: = [1,5,8,10], second: = [12,13,15,24]
-
2 * 1 < 12 → true, count ++, it_first ++ и it_second ++
-
2 * 5 < 13 → true, count ++, it_first ++ и it_second ++
-
2 * 8 < 15 → false, it_second ++
-
8? < 24 → true, count ++ it_second достигнет последнего элемента - END.
-
count == 3
Линейная сложность (худший случай, когда нет таких элементов для удаления. n/2 элементов сравниваются с n/2 элементами). Таким образом, моя недостающая часть - это "правильность" алгоритма - я читал о доказательстве жадных алгоритмов, но в основном с деревьями, и я не могу найти аналогию. Любая помощь будет оценена по достоинству. Спасибо!
EDIT: По правильности я имею в виду: * Оно работает * Это невозможно сделать быстрее (в logn или constant)
Я хотел бы поместить некоторые графики, но из-за точек репутации < 10 - Я не могу.
(Я имел в виду один латекс в начале;))