一.【直线】完整题目地址:https://www.lanqiao.cn/problems/1449/learning/
1.1.题目
1.2.解答
import os
import sys
li=[[ x,y] for x in range(20) for y in range(21)]
s1=set()
s2=set()
for x1,y1 in li:
for x2,y2 in li:
#斜率不存在时:
if x1==x2:
s1.add((x1,x2))
continue
else:
#斜率存在时:y=kx+b
k=(y2-y1)/(x2-x1)
b=(x2*y1-x1*y2)/(x2-x1)
s2.add((k,b))
print(len(s1)+len(s2))
1.3.结果
创建双层列表,代表坐标轴中的点,双层遍历,同时创建两个集合(数据具有唯一性),分为两种情况,斜率存在和斜率不存在,最后把集合是元素个数分别相加即可
注意在算b时,用上面求的k,因为k可能是小数,这样算出来的结果不是很准确
二.【左孩子右兄弟】完整题目地址:https://www.lanqiao.cn/problems/1451/learning/
2.1.题目
2.2.解题
思路:
1.递归算法默认递归100次,怕担心执行次数太多因此更改默认设置: sys.setrecursionlimit(10000) 2.设置输入格式:二维数组一层是父节点,二层是子节点for i in range(2,num+1): 3.如果父节点空返回空,如果有的话就递归调用,相当于计算孩子节点个数:def defs(i) 4.把带子节点的结点放在其那一层的最后一个,那么有子节点的会占一个高,其他没有子节点的放在右孩子节点处,这样保证每一层的高度都最高:return len(li[i])+deep 5.print(defs(1))从i=1开始,即第一个节点开始
import sys
sys.setrecursionlimit(10000)
num=int(input())
li=[[] for i in range(num+1)]
#设置输入格式
for i in range(2,num+1):
parent=int(input())
li[parent].append(i)
#深度遍历,动态规划
def defs(i):
if li[i] is None:
return 0
deep=0
for j in li[i]:
deep=max(deep,defs(j))#所有子节点的个数
return len(li[i])+deep
print(defs(1))