Если элементы положительные (или, по крайней мере, кумулятивные суммы являются монотонными), вы можете применить бинарный поиск:
Рассчитать кумулятивные суммы во вспомогательном массиве Sums[]
При бинарном поиске найдите наименьшееиндекс k
(например, std::lower_bound
в C ++ STL), что
Sums[k] * c1 + (OverallSum - Sums[k]) * c2 >= Value
or
Sums[k] >= (Value - OverallSum * c2) / (c1 - c2)
Обратите внимание, что первый этап занимает время O (n), поэтому для одноразового задания вы можете использовать простой линейный поиск на второмэтап.
Но если вы повторно используете один и тот же массив с разными Value
- бинарный поиск будет более эффективным.
Здесь
Sums = [400, 900, 1500]
(Value - OverallSum * c2) / (c1 - c2) =
(125 - 1500 * 0.1) / (0.05-0.1) =
-25 / -0.05 = 500
The first value in Sums[] > 500 is 900, so index is 1, value is 500