一、卡片。
1. 难度系数:⭐
2. 知识点: 模拟 二分查找 组合数
3. 要点分析:无
import os
import sys
import math
# 输入数据
n = int(input())
count = 0
k = 0
while n>count:
k += 1
count += k
print(k)
二、直线。
1. 难度系数:⭐⭐⭐
2. 知识点: 枚举
3. 要点分析
①构建直线的二元组(k,b),存入容器中,最终计算容器内的元素个数即可。
set 的常用函数汇总:
1)new Set(iterable):创建set,可以传入可迭代的对象,一般是数组
2)set.add(value):添加值到set中,返回set本身
3)set.delete(value):删除值,值存在返回true,否则返回false
4)set.has(value):判断value是否在set中,在返回true,否则返回false
5)set.clear():清空set
6)set.size:返回集合个数,类似length
②斜率不存在的直线也算直线,额外计算。
import sys
# 创建二维列表:代表xy坐标系
points=[[x,y] for x in range(20) for y in range(21)]
# 创建集合属性的容器
docker=set()
#二重循环遍历每个坐标
for i in points:
x1,y1=i[0],i[1]
for j in points:
x2,y2=j[0],j[1]
if x1==x2:
continue
k=(y2-y1)/(x2-x1)
b=(x2*y1-x1*y2)/(x2-x1)
if (k,b) not in docker: #存入容器里没有的(斜率,截距)对
docker.add((k,b))
print(len(docker)+20)
三、货物摆放。
1.难度系数:⭐⭐⭐
2. 知识点:枚举
3. 要点分析
①找出所有的正因子。
n = 2021041820210418
lst = []
for i in range(1,int(n**0.5)+1):
if (n % i == 0):
lst.append(i)
if n / i != i:
lst.append(n//i)
print(lst)
②暴力求解。
import sys
import os
ans = 0
n = 2021041820210418
lst = []
for i in range(1,int(n**0.5)+1):
if (n % i == 0):
lst.append(i)
if n / i != i:
lst.append(n//i)
docker = set()
for i in lst:
for j in lst:
x = n//i//j
if n%(i*j)==0:
if (i,j,x) not in docker and x in lst:
docker.add((i,j,x))
print(len(docker))
四、路径。
1.难度系数:⭐⭐⭐⭐
2. 知识点:图论 动态规划 LCM 最短路径
3. 要点分析
①求解最小公倍数。
②动态规划,得到全局最优解。
import sys
import math
#求最小公倍数
def gbs(a,b):
return a*b//(math.gcd(a,b))
n = 2021
length = 0
dp = [float('inf')]*(n+1)
# 初始条件
dp[1] = 0
# 转移关系
for i in range(1, n+1):
for j in range(i+1,i+22):
if j > 2021:
break
dp[j] = min(dp[j],dp[i]+gbs(i,j))
# 输出末尾值
print(dp[-1])
五、回路计数。
1.难度系数:⭐⭐⭐⭐⭐
2. 知识点:动态规划 状压DP
3. 要点分析
六、时间显示。
1. 难度系数:⭐⭐⭐
2. 知识点: 单位换算
3. 要点分析:无。
import os
import sys
import math
# 输入数据
num = int(input())
# 计算有多少小时
oneHour = 60*60*1000
hour = (num // oneHour) % 24
# 计算有多少分钟
oneMinute = 60 * 1000
leftTime = num - hour * oneHour
minute = (leftTime // oneMinute) % 60
# 计算有多少秒
oneSecond = 1000
leftTime = num - minute * oneHour
second = (leftTime // oneSecond) % 60
# 输出具体时间
print("{:02d}:{:02d}:{:02d}".format(hour, minute, second))
七、杨辉三角形。
1. 难度系数:⭐⭐⭐⭐
2. 知识点:规律 思维 二分
3. 要点分析
①“杨辉三角形”对称,只需看左半边;每行最大的数为 C(n, n // 2),当n取33时有C(n, n // 2) > 1000000000,因此只需考虑0到33行。
②逐行搜索,该数第一次出现的位置,即为当前行最大的数。
③用“二分法”进行查找,查找速度会得到有效提升。
import sys
import os
# 计算二项式
def C(n, m):
up = 1; down = 1
t = n
for i in range(1, min(m, n - m) + 1):
up *= t; t -= 1
down *= i
return up // down
# 二分查找
def search(i):
l = i
r = max(n, l)
k = i // 2
while l < r:
mid = (l+r) >>1
if C(mid, k) < n:
l = mid + 1
else:
r = mid
return l
n = int(input())
for i in range(34,-1,-2):
# 逐行搜索
t = search(i)
if C(t, i // 2) == n:
print(t * (t + 1) // 2 + i // 2 + 1)
break
八、左孩子右兄弟。
1. 难度系数:⭐⭐⭐⭐
2. 知识点:树形DP 动态规划
3. 要点分析
①“函数递归调用”会将大量的上下文信息入栈,如果递归深度过大,会导致线程栈空间不足而崩溃;在Python中,为了防止栈崩溃,默认递归深度是有限的。因此,我们需要自行设置最大的递归深度。
②了解“孩子兄弟表示法”。
③本质上是利用“递归”,求解树的深度。
递推公式:最深深度=子结点个数+子结点的最深深度
import os
import sys
# 设置最大递归深度
sys.setrecursionlimit(100000)
# 输入数据
n = int(input())
# 存储多叉树中每一层的节点数据
node = [[] for _ in range(n+1)]
for i in range(2, n+1):
v = int(input())
node[v].append(i)
# 根节点里子节点的最深高度
def search(index):
# 叶子节点
if node[index] is None:
return 0
maxn = 0
for x in node[index]:
maxn = max(maxn, search(x))
return len(node[index]) + maxn
print(search(1))
九、异或数列。
1. 难度系数:
2. 知识点:
3. 要点分析
十、括号序列。
1. 难度系数:
2. 知识点:
3. 要点分析