今晚九点, 笔试,选择题中规中矩,虽然难, 但是我可以接受。不像美团的java,c++,定积分,行列矩阵,,。mmp,不过只有一个小时的时间,时间很短。30多道选择题,留给两道编程题的时间不到30分钟。大眼瞪小眼的看了许久,得出的结论是, 这题虽然不难, 但不是我这个小菜鸡能迅速解决的,一下子变得坦然起来。看了一会有了思路,看看了时间,是不够我写出两道题的时间的,权衡利弊,做到了心中有B数,遂提交考卷,退出浏览器。打开pycharm,接着刚才的思路,写了会(外加一个暴力方法,看表是经历一个多小时,但是感觉很快),写出了代码。但因为本菜鸡,刷的题少,也没遇到过类似的题,也不知道自己的想法对不对。测试了几个简单的例子,感觉应该是对的,稍微复杂的例子了,我这人脑就不知道程序的结果对不对了,于是又写了个暴力的方法, 穷举所有的情况,计算所有的花费,再取最少的花费。最后验证,我的方法是对的。
今天还有面试,结果昨天(个人感觉上是今天, 因为过了12点),一不小心在算法上搞了太长时间,,
顺祝自己的一次面试全程少尿点。
2019年9月12日 00点49分
题目描述
公司准备给 n 名用户快递礼物,在甲地和乙地各有个仓库存放了 a 和 b 个这种礼物。从甲地和乙地给每名用户快递礼物的费用是不同的,请计算让 n 名用户都收到礼物的最低总费用是多少。
输入描述:
输入包含 n + 2 行。
第一行包含一个整数 n (1 <= n <= 1000), 表示需要寄礼物的用户数。
第二行包含两个整数 a 和 b (1 <= a,b <= n <= a + b), a 表示甲地仓库存放的礼物数量,b 表示乙地仓库存放的礼物数量。
接下来 n 行每行有两个整数 c[i] 和 d[i] (0 < c[i], d[i] <= 100), c[i] 表示从甲地给第 i 名用户寄礼物的费用,d[i] 表示从乙地给第 i 名 用户寄礼物的费用。
输出描述:
输出一个整数, 即最低的总费用
示例1输入输出示例仅供调试,后台判题数据一般不包含示例
输入
3
1 2
13 19
4 9
10 20
输出
38
说明
公司要给 3 名用户发礼物,甲地仓库存放了 1 个礼物,乙地仓库存放了 2 个礼物。
第一个用户选择从乙地发货,费用为 19。
第二个用户选择从乙地发货,费用为 9。
第三个用户选择从甲地发货,费用为 10。
最低总费用为 19 + 9 + 10 = 38
我的代码:
def find_max(arr1, arr2):
"""
返回对应位置的额差值的绝对值最大的位置
# a = [2, 7, 5],
# b = [8, 3, 1]
# tmp_list = [-6, 4, 4]
# return max_index 返回 0
"""
tmp = []
for i in range(len(arr1)):
tmp.append(arr1[i] - arr2[i])
tmp_list = list(map(lambda x: abs(x), tmp))
max_index = tmp_list.index(max(tmp_list))
return max_index
def my_sort(la, lb, a_t, b_t):
"""
:param la:a的价格列表
:param lb: b的价格列表
:param a_t: a的货存
"""
total_price = 0
while a_t > 0 and b_t > 0:
max_index = find_max(la, lb)
if la[max_index] < lb[max_index]:
total_price += la[max_index]
la.pop(max_index)
lb.pop(max_index)
a_t -= 1
else:
total_price += lb[max_index]
la.pop(max_index)
lb.pop(max_index)
b_t -= 1
if a_t > 0:
total_price += sum(la)
if b_t > 0:
total_price += sum(lb)
return total_price
a = [23, 1, 23, 45, 67, 89, 23, 45, 35, 26]
b = [8, 21, 33, 67, 26, 78, 98, 68, 21, 34]
a_t = 5
b_t = len(a) - a_t
print(my_sort(a, b, a_t, b_t))
用来验证的暴力穷举法
from itertools import combinations
import copy
l1 = [23, 1, 23, 45, 67, 89, 23, 45, 35, 26]
l2 = [8, 21, 33, 67, 26, 78, 98, 68, 21, 34]
my_list = []
result = []
p = combinations([i for i in range(10)], 5)
# 列举所用组合, range参数是l1的长度, 5 是a仓库的存货
for i in p:
my_list.append(i)
for i in my_list:
tmp = 0
l3 = copy.deepcopy(l2)
for j in i:
tmp += l1[j]
l3[j] = 0
tmp += sum(l3)
result.append(tmp)
print(min(result))
实测:暴力法是我的方案用时的30倍,测试的数据长度只是10。
可惜不能在笔试的时候测试我的代码了, 也不知道会不会因为用时给我diss掉,感觉整个平台对py都是歧视的,刷题的时候,一套思路py就因为用时挂掉,而java就能顺利通过。出来了c, c++, 剩下的语言不都是其他语言么。。也有可能是我太菜。
下面是第二题,我感觉很有意思,暂搁,
题目描述
假设一个地图用二维矩阵组成(M行N列),地图由路(0)、障碍物(1)构成,地图中有一只猫(2)和一只老鼠(3),总归有一条路可以找到老鼠,
请用算法实现算出猫捉到老鼠的最短步数
输入描述:
M行N列的数组,包含 0 1 2 3数字,其中
0=空地
1=墙
2=猫
3=老鼠
输出描述:
最短路径长度
示例1输入输出示例仅供调试,后台判题数据一般不包含示例
输入
复制
2 0 0 1
0 1 0 1
1 0 0 0
3 0 1 0
输出
复制
7