part01-1 试题 算法训练 共线

欢迎大家斧正

目录

题目描述

问题分析

代码

1.第一次50%的代码

2.第二次100%代码


题目描述

资源限制

内存限制: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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值