一.填空题
1.卡片
a = []
for i in range(10):
a.append(2021)
num = 1
ans = 0
while True:
b = list(map(int, str(num)))
for j in b:
a[j] -= 1
if(a[j]) < 0:
ans = num - 1
break
if ans != 0:
break
else:
num += 1
print(ans)
3.货物摆放
n = 2021041820210418
a = []
for i in range(1, int(n ** 0.5) + 1):
if n % i == 0:
a.append(i)
a.append(n/i)
p = set(a)
ans = 0
for i in p:
for j in p:
for k in p:
if i * j * k == n:
ans += 1
print(ans)
4.路径
//迪杰斯特拉算法
def minBei(x, y):
if x == 0 or y == 0:
return 0
x1, y1 = x, y
while y1:
x1, y1 = y1, x1 % y1
return x * y // x1
maxL = float('inf')
n = 2021
a = [[maxL for _ in range(n+1)] for _ in range(n+1)]
for i in range(1, n+1):
for j in range(i, n+1):
if -21 <= i-j <= 21:
a[j][i] = a[i][j] = minBei(i, j)
p = [a[1][i] for i in range(n+1)]
sign = [False for _ in range(n+1)]
for i in range(1, n+1):
x = 0
m = maxL
for j in range(1, n+1):
if (not sign[j]) and p[j] < m:
m = p[j]
x = j
sign[x] = True
if x == 2021:
break
for j in range(1, n+1):
if not sign[j]:
p[j] = min(p[x] + a[x][j], p[j])
print(p[n])
//弗洛伊德算法(Floyd)
import math
maxL = float('inf')
def minBei(x, y):
if x == 0 or y == 0:
return 0
x1, y1 = x, y
while y1:
x1, y1 = y1, x1 % y1
return x * y // x1
n = 2021
a = [[maxL] * 2022 for i in range(2022)]
for i in range(1, 2022):
for j in range(1, 2022):
if abs(i-j) <= 21:
a[i][j] = minBei(i, j)
for k in range(2, n + 1):
for i in range(2, n + 1):
a[1][i] = min(a[1][i], a[1][k] + a[k][i])
print(a[1][2021])
5.回路



