第二题
原题没有截图,下面是我回忆的版本:
在二维坐标系中,以原点为中心有一个圆,给定一个数组arr,数组中的数字为某个度数,范围是[0°, 360°],度数的含义是以x轴为起点逆时针旋转的角度。现在让你求从数组中选出三个数,每个数对应的角度都可以得到一个圆上的点,这三个点可以构成一个三角形。现在要求数组中可以组成的所有三角形中,钝角三角形的个数。
输入:第一行为数字n,是数组的长度。以下n行为数组中的n个数。
输入样例:
4
0
10
100
300
输出:
1
样例解析:数组长度为4,数组为{0, 10, 100, 300},钝角三角形只有1种情况(0, 10, 100)。
解题思路:
利用一个数学定理:如果圆上的三个点构成的三角形为钝角三角形,那么这三个点必须是位与同一个半圆范围内。例如(0, 10, 100)三个点都是处于0°~180°这个半圆范围内。
如何判断三个角度是否位与同一个半圆范围内?
得到三个角度后,首先对角度最小的点做反向延长线,例如(0, 10, 100)三个点,做0的反向延长线,得到180,现在我们只需判断其它两个角度10和100是否同时处于[0°, 180°)的半圆内,或同时处于(180°, 360°]的半圆内即可。
注意:当有两个角度相差180°的时候,例如(0, 10, 180),组成的三角形一定是直角三角形,而不是钝角三角形。
Python源代码:
# -*- coding:utf-8 -*-
def find_tri(alist):
res = 0
alist_copy = list(alist)
for i, num in enumerate(alist_copy):
key = num + 180
bigger = [x for x in alist if x > key and x != num]
smaller = [x for x in alist if x < key and x != num]
alist.remove(num)
print bigger
print smaller
if len(bigger) >= 2:
res += len(bigger) * (len(bigger) - 1) / 2
if len(smaller) >= 2:
res += len(smaller) * (len(smaller) - 1) / 2
print "i =", i, "res=", res
print "res =", res
if __name__ == "__main__":
num = int(raw_input())
alist = []
for i in range(num):
alist.append(int(raw_input()))
alist.sort()
find_tri(alist)