给定区域内的有效三角形数

时间:2018-09-17 07:12:47

标签: algorithm

让整数x,y,z为三角形的三个边,给出三个整数X,Y,Z分别代表三个边的值的范围。例如,当X = 3时,x可以是1或2或3。找到可以由x,y,z构造的有效三角形的数量。

注意:

     a. 3,4,5 and 3,5,4 are two different triangles.

     b. x,y,z can be reach 10^9. So traversing algorithm is unreasonable.

示例:

     X = 2 
     Y = 3 
     Z = 3

     Answer: 9

说明:我们在这里有9个可能的三角形:(1,1,1) (1,2,2) (1,3,3) (2,1,2) (2,2,1) (2,2,2) (2,2,3) (2,3,2) (2,3,3)

2 个答案:

答案 0 :(得分:0)

为简单起见,假设x <= y。

所以y = x + k,且k> =0。对于要保持的三角形不等式,x + z> = y。所以x + z> = x + k。所以z> = k。

所以z = k + h,且h> = 0。

现在我们有x + z => y,而y + z> = x。我们只需要检查x + y> = z,即x + x + k> = k + h。所以2x> = h。

For every possible x:
    for every possible y >= x:
        answer += 2x + 1  // (k + 0, k + 1 ... k + 2x)

但是这仍然是O(n ^ 2),因此我们需要尝试删除第二个循环。您可能已经注意到,我们没有使用y的任何信息来求和,因为我们总是回答+ = 2x +1而不管y。因此我们可以将其减少为:

For every possible x:
    answer += (2x + 1) * (max y - x + 1)

这只是一般性的想法,不会解决整个问题,而只是提示如何进行。请注意,这里我们没有检查任何边界,每个可能的x都意味着x不应超过max y值,并且也没有检查z是否可以达到这些值。当(y-x)+ 2x> max z时,我们需要减少计数,但是可以固定。然后,您可以对y

答案 1 :(得分:-1)

我建议在这里使用强力方法,并建议您通过解决此问题来降低其复杂性。如果您可以分享自己已经取得的一些进步,将会非常有帮助。

据我了解,我们获得了x,y和z取值的上限/上限。

所以

  • 当x = 2时,x可以为[1,2]
  • 当y = 3时,y可以为[1,2,3]
  • 当z = 3时,z可以 是[1,2,3]

我建议您可以输入以下内容:

count = 0
for every value x in arr_x:
  for every value y in arr_y:
    for every value z in arr_z:
      if triangle inequality is satisfied:
        increment count by 1
return count