流利说笔试

今晚九点, 笔试,选择题中规中矩,虽然难, 但是我可以接受。不像美团的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++, 剩下的语言不都是其他语言么。。也有可能是我太菜。

 


下面是第二题,我感觉很有意思,暂搁,

题目描述

假设一个地图用二维矩阵组成(MN列),地图由路(0)、障碍物(1)构成,地图中有一只猫(2)和一只老鼠(3),总归有一条路可以找到老鼠,
请用算法实现算出猫捉到老鼠的最短步数

输入描述:

MN列的数组,包含 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

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值