美团2020算法工程师编程题--外卖小哥的保温箱

题目描述:

众所周知,美团外卖的口号是:”美团外卖,送啥都快”。身着黄色工作服的骑手作为外卖业务中商家和客户的重要纽带,在工作中,以快速送餐突出业务能力;工作之余,他们会通过玩智力游戏消遣闲暇时光,以反应速度彰显智慧,每位骑手拿出装有货物的保温箱,参赛选手需在最短的时间内用最少的保温箱将货物装好。

我们把问题简单描述一下:

1 每个货物占用空间都一模一样

2 外卖小哥保温箱的最大容量是不一样的,每个保温箱由两个值描述: 保温箱的最大容量 bi ,当前已有货物个数 ai ,(ai<=bi)

3 货物转移的时候,不必一次性全部转移,每转移一件货物需要花费 1秒 的时间

测试示例:

输入描述:
第一行包含n个正整数(1<=n<=100)表示保温箱的数量

第二行有n个正整数a1,a2,…,an(1<=ai<=100)

ai表示第i个保温箱的已有货物个数

第三行有n个正整数b1,b2,…,bn(1<=bi<=100),bi表示第i个保温箱的最大容量

显然,每一个ai<=bi

输出描述:
输出为两个整数k和t, k表示能容纳所有货物的保温箱的最少个数,t表示将所有货物转移到这k个保温箱所花费的最少时间,单位为秒.

输入示例:
4
3 3 4 3
4 7 6 5

输出示例:
2 6

题目分析:

很简单的一道题,关键是将对应的a和b组成元组,随后按照b为key对这些元组进行降序排列,其中前k个b相加刚好大于sum(ai)时的就是所求的k,而后面的保温箱中的外卖都是需要转移到前面的保温箱中,因此对k+1到N个保温箱中的外卖求和便可得到所用的时间

python实现代码:

import sys
while True:
    n = int(sys.stdin.readline().strip())
    f = [int(x) for x in sys.stdin.readline().strip().split()]
    r = [int(x) for x in sys.stdin.readline().strip().split()]
    x = list(zip(f, r))
    x.sort(key=lambda x: x[1], reverse=True)
    print(x)
    total_f = sum(f)
    temp = 0
    k = 0
    t = 0
    for i in range(n):
        temp = temp + x[i][1]
        k += 1
        if temp >= total_f:
            break                           # 得到最少的外卖盒箱k,但是此时的时间不一定是最少的
    for i in range(k, n):
        t += x[i][0]

    for i in range(n, -1+k, -1):            # 得到外卖份数最多的k个外卖箱,且这k个外卖箱的容量满足需求
        temp_f, temp_t = 0, 0
        for j in range(i - k, i):
            temp_f += x[j][1]
            temp_t += x[j][0]
            print('temp_t', temp_t)
        if temp_f >= total_f:
            tt = total_f - temp_t
            t = tt if t > tt else t

    sys.stdout.write('%d  %d'%(k, t))
    ~~~
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值