Есть головоломка, которую я пишу код для решения, который идет следующим образом.
Рассмотрим бинарный вектор длины n, изначально всех нулей. Вы выбираете бит вектора и устанавливаете его в 1. Теперь начинается процесс, который устанавливает бит, который является наибольшим расстоянием от любого 1 бит до $1 $(или произвольного выбора самого дальнего бита, если его больше одного). Это часто повторяется с правилом о том, что ни один из двух бит не может быть рядом друг с другом. Он заканчивается, когда нет места для размещения 1 бит. Цель состоит в том, чтобы поместить начальный 1 бит так, чтобы как можно большее количество бит было установлено на 1 при завершении.
Скажем n = 2. Тогда, где бы мы ни установили бит, мы получим ровно один бит.
При n = 3, если мы установим первый бит, мы получим 101 в конце. Но если мы установим средний бит, мы получим 010, что не является оптимальным.
При n = 4, в зависимости от того, какой бит мы устанавливаем, мы заканчиваем двумя наборами.
При n = 5 установка первого дает нам 10101 с тремя битами, установленными в конце.
При n = 7 нам нужно установить третий бит, чтобы получить 1010101.
Я написал код, чтобы найти оптимальное значение, но оно не масштабируется хорошо для больших n. Мой код начинает замедляться вокруг n = 1000, но я хотел бы решить проблему для n около 1 миллиона.
#!/usr/bin/python
from __future__ import division
from math import *
def findloc(v):
count = 0
maxcount = 0
id = -1
for i in xrange(n):
if (v[i] == 0):
count += 1
if (v[i] == 1):
if (count > maxcount):
maxcount = count
id = i
count = 0
#Deal with vector ending in 0s
if (2*count >= maxcount and count >= v.index(1) and count >1):
return n-1
#Deal with vector starting in 0s
if (2*v.index(1) >= maxcount and v.index(1) > 1):
return 0
if (maxcount <=2):
return -1
return id-int(ceil(maxcount/2))
def addbits(v):
id = findloc(v)
if (id == -1):
return v
v[id] = 1
return addbits(v)
#Set vector length
n=21
max = 0
for i in xrange(n):
v = [0]*n
v[i] = 1
v = addbits(v)
score = sum([1 for j in xrange(n) if v[j] ==1])
# print i, sum([1 for j in xrange(n) if v[j] ==1]), v
if (score > max):
max = score
print max