文章图片
问题分析: 对于我而言,首先将输入储存成[(A1,B1),(A2,B2)...]有点困难了一开始
参考了别人的代码 知道了。利用循环+map赋值 添加到列表当中
N=int(input())
s=[]
for i in range(N):
a,b=map(int,input().split())
s.append((a,b))
其次,学到了,计算两直线的交点时,可以定义一个函数 坐标结果精确到10位(差不多了) ,不必再用分数表示(我自己想出来的办法,效率不高就不阐述了)
比如给定列表[(1,2),(2,4),(4,6)....]我们可以这样定义函数求其中某一条直线与先前直线的交点
def getnode(line1,line2):
A1,A2=line1[0],line2[0]
B1,B2=line1[1],line2[1]
if A1==A2:
return
else:
x=(B2-B1)/(A1-A2)
y=A1*x+B1
x,y=round(x,10),round(y,10)
return (x,y)
上面都是一些基本操作,要先熟悉,然后回到本题,下面讲述本题的关键点。
还是找规律
文章图片
所以定义c[i]为加入第条直线后 区域的增加量 结果对其求和即可
现在的问题就是:获取一条直线后 求它和先前直线的交点个数:由于交点有可能重合,又只能算一个,我们不妨使用集合,每次做这项工作的时候set.clear(),解出一个交点就update([(#坐标)]),然后计算每次工作set的长度即交点个数,返回到c[i]中
下面代码参考自某位DL,非本人创作,感谢其让我学到了很多!
文章图片
https://www.acwing.com/solution/content/37372/
【Python|蓝桥杯 平面切割 Python】
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)
文章图片
我是小郑 一个在备战蓝桥杯的大一学生 一起加油!
推荐阅读
- 推荐系统论文进阶|CTR预估 论文精读(十一)--Deep Interest Evolution Network(DIEN)
- Python专栏|数据分析的常规流程
- Python|Win10下 Python开发环境搭建(PyCharm + Anaconda) && 环境变量配置 && 常用工具安装配置
- Python绘制小红花
- Pytorch学习|sklearn-SVM 模型保存、交叉验证与网格搜索
- OpenCV|OpenCV-Python实战(18)——深度学习简介与入门示例
- python|8. 文件系统——文件的删除、移动、复制过程以及链接文件
- 笔记|如何在Windows11安装安卓子系统()
- 爬虫|若想拿下爬虫大单,怎能不会逆向爬虫,价值过万的逆向爬虫教程限时分享
- 分布式|《Python3网络爬虫开发实战(第二版)》内容介绍