当前位置: 首页 > 面试经验 >

【华为OD机试2023】取出尽量少的球(Python)

优质
小牛编辑
88浏览
2023-03-28

【华为OD机试2023】取出尽量少的球(Python)

题目描述:

某部门开展Family Day开放日活动,其中有个从桶里取球的游戏,游戏规则如下:有N个容量一样的小桶等距排开,且每个小桶都默认装了数量不等的小球,每个小桶所装的小球数量记录在数组bucketBallNums中,游戏开始时,要求所有桶的小球总数不能超过SUM,如果小球总数超过SUM,则需对所有的小桶统一设置一个容量最大值maxCapacity,并需将超过容量最大值的小球拿出来,直至小桶里的小球数量小于maxCapacity;请您根据输入的数据,计算从每个小桶里拿出的小球数量?

限制规则一:

如果所有小桶的小球总和小于SUM,则无需设置容量值,并且无需从小桶中拿球出来,返回结果[];

限制规则二:

如果所有小桶的小球总和大于SUM,则需设置容量最大值maxCapacity,并且需从小桶中拿球出来,返回从每个小桶拿出的小球数量组成的数组;

输入描述:

第一行输入2个正整数,数字之间使用空格隔开,其中第一个数字表示SUM;第二个数字表示bucketBallNums数组长度;

第二行输入N个正整数,数字之间使用空格隔开,表示bucketBallNums的每一项;

输出描述:

从每个小桶里拿出的小球数量,并使用一维数组表示

补充说明:

1 <= bucketBallNums[i] <= 10^9

1 <= bucketBallNums.length = N <= 10^5

1 <= maxCapacity <= 10^9

1 <= SUM <= 10^9

示例1

输入:

14 7

2 3 2 5 5 1 4

输出:

[0,1,0,3,3,0,2]

说明:

小球总数为22,SUM=14,超出范围了,需从小桶取球,maxCapacity=1,取出球后,桶里剩余小球总和为7,远小于14;maxCapacity=2,取出小球后,桶里剩余小球总和为13,小于最大值;maxCapacity=3,取出小球后,桶里剩余小球总和为16,大于14;因此maxCapacity=2,每个小桶小球数量大于2的都需要拿出来;

示例2

输入:

3 3

1 2 3

输出:

[0,1,2]

说明:

小球总数为6,SUM=3,超出范围了,需从小桶取球,maxCapacity=1,则小球总数为3,从1号桶取0个球,1号桶取1个球,2号桶取2个球;

示例3

输入:

6 2

3 2

输出:

[]

说明:

小球总数为5,SUM=6,在范围内,无需从小桶取球;

解题思路:

看到小球数<=10^9,我第一时间想到的是二分法,不断下压maxCapacity的数值,先找到一个符合要求(桶内小球总数不超过Sum)的数字,然后不断+1、+1试探,找到符合要求的最大值

求出这个maxCapacity的最大值后,输出就很简单了


#统计桶内球总数
def count_sum(lst:list):
sum=0
for num in lst:
sum+=num
return sum
#不得超过的Sum和小桶数
sum,bucket=map(int,input().split())
#每个桶内的小球数
balls=list(map(int,input().split()))
#总数不超过Sum,无需取出小球,返回[]
if count_sum(balls)<=sum:
print('[]')
else:
#初始化左右指针,左指针是最少的小球数,右指针是最大的小球数
right=max(balls)
left=min(balls)
zhizhen=(right+left)//2
#构建新列表,列表内是maxCapacity=zhizhen时,各个小桶内可以剩下多少球
balls_new=[min(i,zhizhen) for i in balls]
#一直循环寻找合适的zhizhen,直到小桶内剩下的球<=Sum
while count_sum(balls_new) > sum:
right=zhizhen
zhizhen=(right+left)//2
balls_new = [min(i, zhizhen) for i in balls]
#zhizhen数不断+1变大,直到达到某个数后,桶内剩余的球又大于Sum了,这个数减1就是maxCapacity
while count_sum(balls_new) <=sum:
zhizhen+=1
balls_new = [min(i, zhizhen) for i in balls]
max_num=zhizhen-1
print([0 if i<=max_num else i-max_num for i in balls])

#华为机试,emo了#
 类似资料: