标签:node 直线 ci A1 Python lines 蓝桥 切分 平面
题目大意
给定多条直线,询问这多条直线将平面分成了几部分?
输入 A 和 B,代表当前直线为
y = A * X + B
思路
-
我们知道一条直线可以把平面分成两部分,可以理解成这条直线的加入贡献了一个新的
部分
(可能说的不严谨,指的是答案加1,因为初始状态是一个整的平面) -
若用
ci[i]
表示第i条加入的直线对答案的贡献 -
易知
ci[1] = 1
-
若当前加入直线与平面内现存直线存在n个不同交点,则
ci[i] = 1 + n
-
所以最终答案即为ci数组之和
那么ci[i]
为什么等于1 + n呢?
简单思考下,第一条加入的直线势必会把平面分成两部分,第二条加入直线如果与第一条平行,那么这条直线只是在分割前面那两部分中的一部分,它不会对另一部分产生影响,如下图所示,用红色矩形表示整平面,则橙色直线不会对紫色区域产生分割。若不平行,那肯定会对紫色区域进行分割。
代码实现
注意要维护新加入直线与先前直线 不同的交点, 用set即可
import sys
n = int(input())
lines = []
for i in range(n):
a, b = list(map(int, input().split()))
lines.append((a, b))
lines = list(set(lines))#这里是去掉重复直线
n = len(lines)
def getnode(lines1, lines2):#得到两条直线交点,若平行,返回None
A1 = lines1[0]
B1 = lines1[1]
A2 = lines2[0]
B2 = lines2[1]
if A1 - A2 == 0:
return
x = (B2 - B1) / (A1 - A2)
y = A1 * x + B1
x = round(x, 10)
y = round(y, 10)
return (x, y)
ci = [1] * (n + 1)
node = set()
for i in range(1, n):
node.clear()
for j in range(i):
tmp = getnode(lines[i], lines[j])
if tmp == None: continue
node.add(tmp)
ci[i] += len(node)
print(sum(ci[:n]) + 1)
标签:node,直线,ci,A1,Python,lines,蓝桥,切分,平面 来源: https://blog.csdn.net/eveee1123/article/details/114108878
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。