终于做对了一道困难题,开心
题目描述
平面上有 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))
编码不易,有帮助的话点个支持一下吧