一.填空题
1.卡片
n = []
for i in range(0, 10):
n.append(2021)
num = 1
ans = 0
while True:
b = list(map(int, str(num)))
for i in b:
n[i] -= 1
if n[i] < 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])
import math
def gcm(x, y):
return x*y//math.gcd(x, y)
n = 2021
dp = [float('inf') for _ in range(n + 1)]
dp[1] = 0
for i in range(1, n+1):
for j in range(i+1, i+22):
if j > n:
break
dp[j] = min(dp[j], dp[i]+gcm(i, j))
print(dp[n])
5.回路
F:
n = int(input())
n = n // 1000
n %= 24*60*60
s = n%60
n //= 60
m = n%60
n //= 60
h = n
print("{:02d}:{:02d}:{:02d}".format(h,m,s))