欢迎大家斧正
目录
题目描述
资源限制
内存限制: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
数据规模和约定
n<=1500,数据保证不会存在2个相同的点。
点坐标在int范围内
问题分析
这题我感觉还是很难的,呜呜呜~
首先,得知道什么情况会共线;点满足y=kx+b即共线,但是这个题目不需要用这个公式,我们采用穷举的方法,先对两个点形成一个直线,判断其他点在不在这个直线上,我们只需用斜率判断即可(k1=k2)
发现这题不是靠排序,而是靠枚举
代码
1.第一次50%的代码
代码如下:
n = int(input())
data = []
ans = 0
for i in range(n):
x, y = map(int,input().split())
data.append([x, y])
for i in range(n):
for j in range(i+1, n):
count = 0
x0 = data[i][0] - data[j][0]
y0 = data[i][1] - data[j][1]#从前到后一次形成直线
for k in range(n):#接着一次判断点是否在直线上,如果在就count++
if x0 * (data[i][1] - data[k][1]) == y0 * (data[i][0] - data[k][0]):
count += 1
ans = max(ans, count)
print(ans)
2.第二次100%代码
代码如下:
n = int(input())
data = []
ans = 0
for i in range(n):
x, y = map(int, input().split())
data.append([x, y])
for i in range(1,n):
count = 0
x0 = data[i][0] - data[i-1][0]
y0 = data[i][1] - data[i-1][1]#直接用减法避免套一个循环
for j in range(n):
if x0 * (data[i][1] - data[j][1]) == y0 * (data[i][0] - data[j][0]):
count += 1
ans = max(ans, count)
print(ans)