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