2021.7.7校招
第一题
给定N个任务,每个任务有SLA时间和对应积分,在SLA时间前完成才能获得积分,每个任务完成只需一小时。求最大能获得的积分。
7
1 6
1 7
3 2
3 1
2 4
2 5
6 1
积分是15,先做1-7,再做2-5,在做3-2,在做6-1.
def execute(listN):
listN.sort()
# print(listN)
res = []
count = 0
for i in listN:
if count < i[0]:
res.append(i[1])
count += 1
elif count == i[0] and i[1] > min(res):
res.pop(res.index(min(res)))
res.append(i[1]) # 替换,所以不加1
else:
res.append(i[1])
count += 1
# print(res)
print(sum(res))
listN = [[1,6], [1,7], [3,25], [3,8], [4,25], [2,5], [3,8]]
# listN = [[1,6], [1,7], [3,25], [3,8], [4,25], [2,5], [3,8]]
execute(listN)
第二题
// [1,2,15]
// [1,3,14]
// [3,4,9]
// 4
// 1
输出23, 路线1-3-4.虽然不经过2,但是1可以到2,所以算能到达。
输入如上,前三行分别代表景点1到景点2之间有路,距离为15,景点1到景点3之间有路,距离为14,景点3到景点4之间有路,距离为9。
接下来输入一共有多少个景点,下一行是起始景点。问是否能逛完,可以的话求最长路径,否则输出-1.景点数小于100,路径长度小于100,两个景点间路径数小于5000.
这个输入处理麻烦,因为格式不一致而且不确定有多少
空瓶子换饮料
def traceback(sum, res):
if res < 2:
return sum
if res == 2:
res += 1 # 借1个
sum += res//3
res = res//3 + res%3
# print(sum, res)
return traceback(sum, res)
def func(N):
for i in N:
sum = 0
res = i
sum = traceback(sum, res)
print(sum)
if __name__ == "__main__":
N = []
while True:
try:
number = int(input())
if number == 0:
break
N.append(number)
except EOFError:
break
func(N)
415. 字符串相加
请设计一个算法完成两个超长正整数的加法。
输入两个字符串数字
class Solution:
def addStrings(self, num1: str, num2: str) -> str:
length = len(num2) if len(num1) < len(num2) else len(num1)
x = (' '.join(num1)).split(' ')
y = (' '.join(num2)).split(' ')
# 处理长度
if len(num1) < length:
for i in range(length-len(num1)):
x.insert(0, 0)
if len(num2) < length:
for i in range(length-len(num2)):
y.insert(0, 0)
res = ''
for i in range(-1, -(length)-1, -1):
if (int(x[i]) + int(y[i])) >= 10:
res += str((int(x[i]) + int(y[i]))%10)
if i-1 >= -len(x): # 能进位则进位
x[i-1] = int(x[i-1]) + 1
else: # 不能进位则补位
res += '1'
else:
res += str(int(x[i]) + int(y[i]))
res = res[::-1]
return res
逛动物园-Floyd
"""
弗洛伊德算法
https://blog.csdn.net/ustbbsy/article/details/102556540
描述:Jack周日去动物园看“猩猩”,为了直达目的地,Jack想根据动物园地图计算从园区入口到“猩猩”馆的最短路径是多长?
输入: 输入中第一行第一个数为动物园展览馆总数n(包括0号馆),第二个数为“猩猩”馆的数字编号(入口编号为0号馆)。后面的输入是一个n×n的矩阵,表示动物园地图,其中,矩阵节点之间用一个空格隔开,矩阵节点的值n[i][j]代表i号馆到j号馆的距离,0表示馆间不通或无效路径。
输入:
5 4
0 7 3 10 15
7 0 5 13 12
3 5 0 5 10
10 13 5 0 11
15 12 10 11 0
输出 :13(园区入口到“猩猩“馆的最短路径。)
弗洛伊德与迪杰斯特拉算法的区别:
1.Floyd算法是求任意两点之间的距离,是多源最短路,而Dijkstra(迪杰斯特拉)算法是求一个顶点到其他所有顶点的最短路径,是单源最短路。
2.Floyd算法可以算带负权的,而Dijkstra(迪杰斯特拉)算法是不可以算带负权的。并且Floyd算法不能算负权回路。
3.Dijkstra(迪杰斯特拉)算法时间复杂度一般是o(n^2),Floyd算法时间复杂度是o(n^3),Dijkstra(迪杰斯特拉)算法比Floyd算法块。
4.Floyd算法属于动态规划,Dijkstra(迪杰斯特拉)算法属于贪心算法。
"""
def execute(dp):
for k in range(n):
for i in range(n):
for j in range(n):
if(dp[i