试题 历届试题 平面切分【第十一届】【省赛】【B组】 python

资源限制

内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s

问题描述

平面上有N条直线,其中第 i条直线是 y = Ai*x + Bi。
请计算这些直线将平面分成了几个部分。

输入格式

第一行包含一个整数 N。

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

输出格式

一个整数代表答案。

输入样例

3
1 1
2 2
3 3

输出样例

6

数据范围

对于 50 评测用例, 1 ≤ N ≤ 4,-10 ≤ Ai,Bi ≤ 10。
对于所有评测用例, 1 ≤ N ≤ 1000,-100000≤ Ai,Bi ≤100000。

# 找规律
# 1.没有直线切分的时候只有1个平面
# 2.一条直线将平面切分为2个平面
# 3.加入第二条直线有三种情况:重合、平行、相交
# 重合:没意义,还是两个平面
# 平行:有3个平面
# 相交:有一个交点,分为4个平面
# 4.加入第三条直线,有三种情况:重合、平行、相交
# 重合:与任意一条直线重合都没意义,还是两条直线切分的结果
# 平行:平行的情况是与所有直线平行,再两条直线的基础上+1
# 相交:一个交点切分为5个平面,两个交点切分为6个平面
# ***********
# 以此类推可以发现,每增加一条直线切分平面数就增加n+1(n是交点数)

n = int(input())
arr = set() # 使用set数据类型,可以将重合的线去掉(重合的线没有意义)
# 去掉重合的直线后,平面切分每加一条直线只有两种可能平行和相交,无需再考虑重合
for i in range(n):
   arr.add(tuple(map(int,input().split())))
arr = list(arr)

if n == 0: # 没有直线只有一个平面
   print(1)
elif n == 1: # 只有一条直线只能切分为两个平面
   print(2)
else:
   
   # 第一条直线必然分为两个平面,所以从第二条直线开始逐条增加
   num = 2 # 一条直线时有两个平面
   for i in range(1, len(arr)):
      tmp = set() # 使用set记录交点,交点可能存在重合,因此使用set可以去除重复交点
      for j in range(i):
         # 题目描述的公式为y = ax + b:a是斜率,只有a不等的时候才有交点
         if arr[i][0] != arr[j][0]: 
            # 计算交点(x, y)
            x = (arr[i][1] - arr[j][1])/(arr[j][0] - arr[i][0])
            y = arr[i][0] * x - arr[i][1]
            tmp.add(tuple([x,y]))
      num += len(tmp) + 1
   print(num)

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值