试题 算法训练 共线
资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
给定2维平面上n个整点的坐标,一条直线最多能过几个点?
输入格式
第一行一个整数n表示点的个数
以下n行,每行2个整数分别表示每个点的x,y坐标。
输出格式
输出一个整数表示答案。
样例输入
5
0 0
1 1
2 2
0 3
2 3
样例输出
3
说是排序,结果还是枚举解决
50%可以了
n = int(input())
p = []
for i in range(n):
x,y = map(int,input().split())
p.append([x,y])
ans = 0
def kkk(x1,x2,y1,y2):
k = (y1-y2)/(x1-x2)
b = 0.5*(y1+y2) - 0.5*k*(x1+x2)
return [k,b]
mark = []
for i in range(n):
for j in range(i+1,n):
tmpans = 2
x1 = p[i][0]
y1 = p[i][1]
x2 = p[j][0]
y2 = p[j][1]
if x1 == x2:
continue
tmp = kkk(x1,x2,y1,y2)
k,b = tmp[0],tmp[1]
if tmp in mark:
continue
mark.append(tmp)
for x in range(n):
if p[x] == p[i] or p[x] == p[j]:
continue
if p[x][1] == k*p[x][0] + b:
tmpans += 1
ans = max(ans,tmpans)
print(ans)