Для вектора из n элементов типа integer наиболее эффективный алгоритм, который дает минимальное число шагов преобразования, приводящее к вектору, у которого все его элементы равны, зная, что:
- за один шаг вы можете перенести не более одной точки от элемента к ее соседям ([0, 3, 0] → [1, 2, 0] в порядке, но не [0, 3, 0] → [1, 1, 1]).
- за один шаг элемент мог получить 2 балла: один из его левого соседа и один справа ([3, 0, 3] → [2, 2, 2]).
- первый элемент и последний элемент имеют только один сосед, соответственно, 2-й элемент и элемент n-1.
- элемент не может быть отрицательным на любом шаге.
Примеры:
Given :
0, 3, 0
Then 2 steps are required :
1, 2, 0
1, 1, 1
Given :
3, 0, 3
Then 1 step is required :
2, 2, 2
Given :
4, 0, 0, 0, 4, 0, 0, 0
Then 3 steps are required :
3, 1, 0, 0, 3, 1, 0, 0
2, 1, 1, 0, 2, 1, 1, 0
1, 1, 1; 1, 1, 1, 1, 1
Мой текущий алгоритм основан на суммах целых чисел по каждой стороне элемента. Но я не уверен, что это приведет к минимальным шагам.
FYI проблема является частью конкурса кода (созданного Criteo http://codeofduty.criteo.com), который закончился.