Для обучения конкурсу алгоритмов (а не домашней работы) нам дали этот вопрос из прошлого года. Отправил его на этот сайт, потому что на другом сайте требовался логин.
В этом проблема: http://pastehtml.com/view/c5nhqhdcw.html
Изображение не работает, поэтому разместил его здесь:
Он должен работать менее чем за одну секунду, и я могу только думать о самом медленном способе сделать это, вот что я пробовал:
with open('islandin.txt') as fin:
num_houses, length = map(int, fin.readline().split())
tot_length = length * 4 # side length of square
houses = [map(int, line.split()) for line in fin] # inhabited houses read into list from text file
def cost(house_no):
money = 0
for h, p in houses:
if h == house_no: # Skip this house since you don't count the one you build on
continue
d = abs(h - house_no)
shortest_dist = min(d, tot_length - d)
money += shortest_dist * p
return money
def paths():
for house_no in xrange(1, length * 4 + 1):
yield house_no, cost(house_no)
print house_no, cost(house_no) # for testing
print max(paths(), key=lambda (h, m): m) # Gets max path based on the money it makes
То, что я делаю в данный момент, проходит через каждое место, а затем проходит через каждый жилой дом для этого местоположения, чтобы найти максимальное местоположение дохода.
псевдокод:
max_money = 0
max_location = 0
for every location in 1 to length * 4 + 1
money = 0
for house in inhabited_houses:
money = money + shortest_dist * num_people_in_this_house
if money > max_money
max_money = money
max_location = location
Это слишком медленно, так как он O (LN) и не будет работать под вторым для самого большого тестового примера. Может кто-то, пожалуйста, просто скажите мне, как это сделать в кратчайшие сроки (код не требуется, если вы этого не хотите), поскольку это прослушивало меня целую вечность.
РЕДАКТИРОВАТЬ: должен ли быть способ сделать это менее чем O (L) правильно?