平面切分---蓝桥杯练习

终于做对了一道困难题,开心

题目描述

平面上有 N 条直线,其中第 i 条直线是y=Ai*x+Bi。

请计算这些直线将平面分成了几个部分。

输入描述

第一行包含一个整数 N。

以下 N 行,每行包含两个整数 Ai, Bi。

其中,1≤N≤1000,−10^ 5 ≤ Ai,Bi ≤ 10 ^5。

输出描述

一个整数代表答案。

输入输出样例

输入

	3
	1 1
	2 2
	3 3

输出

	6

思路

好在前段时间做了一道不简单的平面分割题,n个圆和n条直线分割平面
在这里插入图片描述
三条线

最多
在两条线的前提下,交前两条线,且不过前两条线的交点,分割出7个面
最少
在两条线的前提下,交前两条线,且过前两条线的交点,分割出6个面

四条线

最多
在三条线最多的前提下,交前三条线,且不过前三条线的交点,分割出11个面
最少
在三条线最少的前提下,交前三条线,且过前三条线的交点,分割出8个面

五条线

最多
在四条线最多的前提下,交前四条线,且不过前四条线的交点,分割出16个面
最少
在四条线最少的前提下,交前四条线,且过前四条线的交点,分割出10个面

可以看出,当每个交点只有两条直线穿过时,n条直线分割出的平面最多,m=1+(n+1) * n/2

假设有n(n>2)条直线恰好都穿过一个点时,原本最多能分割出1+(n+1)*n/2个面,现在只有2 * n个面,这就会少产生1+(n+1) * n/2 - 2 * n个面。

设nums表示平面的数量,nums=1+(n+1)*n/2,假设n条直线分割平面是最多的情况

遍历每条直线,算出它和它之前所有直线的交点,然后储存交点出现的次数,如果在一条直线的遍历中,出现了两次同一个交点,那么只算一次。

最后遍历所有交点,如果交点数大于2那么说明有平面损失了,这时nums要减去相应损失的平面。

代码

import os
import sys

# 请在此输入您的代码

n=int(input())
lines=[]
for i in range(n):
  m=list(map(int,input().split()))
  lines.append(m)

dt=dict()

for i in range(1,n):
  bits=[]
  for j in range(i):
    if lines[i][1]!=lines[j][1] or lines[i][0]!=lines[j][0]:
      x=(0-lines[i][1]+lines[j][1])/(lines[i][0]-lines[j][0])
      y=lines[i][0]*x+lines[i][1]
      bit=[]
      bit.append(x)
      bit.append(y)
      if bit not in bits:
        bits.append(bit)
        temp=tuple(bit)
        if temp not in dt:
          dt[temp]=2
        else:
          dt[temp]+=1
minus=0
for key in dt.keys():
  a=dt[key]
  if a>2:
    for i in range(a-2):
      minus+=(i+1)
end=1+(n+1)*n/2-minus
print(int(end))

编码不易,有帮助的话点个支持一下吧

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值