В неубывающей последовательности (положительных) целых чисел можно удалить два элемента, если
. Сколько пар максимум можно удалить из этой последовательности?
Поэтому я подумал о следующем решении:
- Беру заданную последовательность и делю на две части (первую и вторую).
- Каждому из них присваиваем итератор - it_first := 0 и it_second := 0 соответственно. количество: = 0
- when it_second != second.length
- if 2 * first[it_first] <= second[it_second]
- count++, it_first++, it_second++
- else
- it_second++
- if 2 * first[it_first] <= second[it_second]
- считать это ответ
Пример:
количество: = 0
[1,5,8,10,12,13,15,24] --> первый := [1,5,8,10], второй := [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 --> ложь, it_second++
8 ?‹24 --> верно, count ++it_second достигает последнего элемента - END.
количество == 3
Линейная сложность (наихудший случай, когда нет таких удаляемых элементов. n/2 элементов сравниваются с n/2 элементами). Так что моя недостающая часть - это «правильность» алгоритма - я читал о доказательстве жадных алгоритмов - но в основном с деревьями, и я не могу найти аналогию. Любая помощь будет оценена по достоинству. Спасибо!
РЕДАКТИРОВАТЬ: Под правильностью я подразумеваю: * Это работает * Это нельзя сделать быстрее (в журнале или константе)
Хотелось бы поставить немного графики, но из-за очков репутации ‹ 10 - не могу. (я имел в виду один латекс в начале ;))
[1, 2, 4, 9]
.[4, 9]
тоже может быть такой парой. Или, как в вашем примере, такой парой может быть[12, 24]
. - person Harsh Gupta   schedule 12.03.2015