前言:
最近忙着备战期末考,刷算法的时间是越来越少了...
目录
填空题
卡片
题目:
小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。 小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个, 就保存起来,卡片就不能用来拼其它数了。 小蓝想知道自己能从 1 拼到多少。 例如,当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10, 但是拼 11 时卡片 11 已经只有一张了,不够拼出 11。 现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1 拼到多少? 提示:建议使用计算机编程解决问题
思路:
for循环走一遍,直到其中一个数字不够用
代码:
def main():
nums=[2021 for _ in range(10)]
n=1
while 1:
for i in str(n):
nums[int(i)] -= 1
if nums[int(i)]<0:
return n-1
n += 1
print(main())
答案:3181
直线
题目:
在平面直角坐标系中,两点可以确定一条直线。
给定平面上 20 × 21 个整点 {(x, y)|0 ≤ x < 20, 0 ≤ y < 21, x ∈ Z, y ∈ Z},即横 坐标是 0 到 19 (包含 0 和 19) 之间的整数、纵坐标是 0 到 20 (包含 0 和 20) 之 间的整数的点。
请问这些点一共确定了多少条不同的直线。
思路:
斜率k=0和无穷的线个数有m+n个,然后创建一个set集合,加进每个点对应k和b的值,最后len一下
代码:
def main(m,n):
res=set()
point=[[x,y] for x in range(m) for y in range(n)]
for i in range(len(point)-1):
for j in range(i+1,len(point)):
x1,y1=point[i][0],point[i][1]
x2,y2=point[j][0],point[j][1]
if x1==x2 or y1==y2:
continue
else:
k=(y2-y1)/(x2-x1)
b=(x2*y1-x1*y2)/(x2-x1)
#print((x1,y1),(x2,y2),(k,b))
res.add((k,b))
return len(res)+m+n
print(main(20,21))
答案:40257
货物摆放
题目:
小蓝有一个超大的仓库,可以摆放很多货物。
现在,