我试图解决Facebook hackercup 2016,Boomerang星座中的一个资格问题。 (http://codeforces.com/gym/100869/attachments/download/4028/2016-facebook-hacker-cup-qualification-round-en.pdf)
我的算法是针对每个星点,计算到其他星的距离,并使用python字典使用距离键来散列其他点。
然后我通过按距离计算每个列表的n *(n-1)/ 2来计算可能的回旋镖星座。
当我运行Facebook提供的输入和输出时,答案是正确的。但是当我将此代码提交给代码强制时,它失败了“超出时间限制”。你能指出哪部分代码无效吗?这会是Python的问题吗?
import math
def findBoomerang(stars):
sum = 0
N = len(stars)
for i in range(N):
lines = {}
for j in range(N):
if i == j:
continue
length = round(distance(stars[i], stars[j]), 3)
if length not in lines:
lines[length] = list()
lines[length].append(stars[j])
for i in lines.keys():
n = len(lines[i])
sum+=(int)(n*(n-1)/2)
return (int)(sum)
def distance(starA, starB):
(x1, y1) = starA
(x2, y2) = starB
return math.sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1))
nights = int(input())
for night in range(nights):
num_stars = int(input())
stars = list()
for i in range(num_stars):
x,y = [int(x) for x in input().split(" ")]
stars.append((x,y))
constellations = findBoomerang(stars)
print("Case #"+ str(night+1)+ ": "+ str(constellations))
答案 0 :(得分:1)
两项小改进。
首先,使用长度为平方而不是长度。这将删除平方根操作的批次。
其次,没有必要列出给定长度的所有星星。相反,你可以算一下。