终于做对了一道困难题,开心
题目描述
平面上有 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