Facebook cup boomerang编程

时间:2016-01-12 22:09:24

标签: python algorithm

我试图解决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))

1 个答案:

答案 0 :(得分:1)

两项小改进。

首先,使用长度为平方而不是长度。这将删除平方根操作的批次

其次,没有必要列出给定长度的所有星星。相反,你可以算一下。