蓝桥杯真题 ——《直线》

题目描述

在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上, 那么这些点中任意两点确定的直线是同一条。

给定平面上 2 × 3 个整点{(x, y)|0 ≤ x < 2, 0 ≤ y < 3, x ∈ Z, y ∈ Z}(x,y)∣0≤x<2,0≤y<3,x∈Z,y∈Z​,即横坐标 是 00 到 11 (包含 0 和 1) 之间的整数、纵坐标是 0 到 2 (包含 0 和 2) 之间的整数 的点。这些点一共确定了 11 条不同的直线。

给定平面上 20 × 2120×21 个整点 {(x, y)|0 ≤ x < 20, 0 ≤ y < 21, x ∈ Z, y ∈ Z}(x,y)∣0≤x<20,0≤y<21,x∈Z,y∈Z,即横 坐标是 00 到 1919 (包含 00 和 1919) 之间的整数、纵坐标是 00 到 2020 (包含 00 和 2020​) 之 间的整数的点。

请问这些点一共确定了多少条不同的直线。

运行限制

最大运行时间:1s
最大运行内存: 128M

解析

在这里插入图片描述

代码

方法一:

xlist = [i for i in range(20)]
ylist = [i for i in range(21)]
points = [(x,y) for x in xlist for y in ylist]
s = set()
def getline(p,q):
  k = (q[1]-p[1])/(q[0]-p[0])
  b = q[1]-q[0]*k
  return round(k,8), round(b,8)

for p in points:
  for q in points:
    if p != q and p[0] != q[0]:
      s.add(getline(p,q))

print(len(s)+20)

方法二:

import os
import sys

class Line(object):

    def __init__(self):
        self.k = 0
        self.b = 0

    def __lt__(self, t):
        if self.k != t.k:
            return self.k < t.k
        return self.b < t.b


N = 200000
n = 0
l = [Line() for _ in range(N)]

for x1 in range(0, 20):
    for y1 in range(0, 21):
        for x2 in range(0, 20):
            for y2 in range(0, 21):
                if x1 != x2:
                    k = float((y2 - y1)) / (x2 - x1)
                    b = float(y2 - k * x2)

                    l[n].k = k
                    l[n].b = b
                    n += 1
L = l[0: n]
L.sort()
res = 1
for i in range(1, n):
    if abs(L[i].k - L[i - 1].k) > 1e-8 or abs(L[i].b - L[i - 1].b) > 1e-8:
        res += 1
print(res + 20)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啥都鼓捣的小yao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值