103. 华为OD-取出尽量少的球(200分)

难度 5
  • 标签:
  • 华为OD真题200分题型
题目描述
题解
题库

华为OD-取出尽量少的球(200分)

题目内容

某部门开展 FamilyDay\text{FamilyDay} 开放日活动,其中有个从桶里取球的游戏,游戏规则如下:

NN 个容量一样的小桶等距排开,且每个小桶都默认装了数量不等的小球,每个小桶装的小球数量记录在数组 bucketBallNums\text{bucketBallNums} 中。

游戏开始时,要求所有桶的小球总数不能超过 SUM\text{SUM}。如果小球总数超过 SUM\text{SUM},则需对所有的小桶统一设置一个容量最大值 maxCapacity\text{maxCapacity},并需将超过容量最大值的小球拿出来,直至小桶里的小球数量小于 maxCapacity\text{maxCapacity}

请您根据输入的数据,计算从每个小桶里拿出的小球数量?

  • 限制规则一:所有小桶的小球总和小于 SUM\text{SUM},则无需设置容量值 maxCapacity\text{maxCapacity},并且无需从小桶中拿球出来,返回结果 [][]
  • 限制规则二:如果所有小桶的小球总和大于 SUM\text{SUM},则需设置容量最大值 maxCapacity\text{maxCapacity},并且需从小桶中拿球出来,返回从每个小桶拿出的小球数量组成的数组。

输入描述

第一行输入 22 个正整数,数字之间使用空格隔开,其中:

  • 第一个数字表示 SUM\text{SUM}
  • 第二个数字表示 bucketBallNums\text{bucketBallNums} 数组长度。

第二行输入 NN 个正整数,数字之间使用空格隔开,表示 bucketBallNums\text{bucketBallNums} 的每一项。

输出描述

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

备注

  • 1bucketBallNums[i]1091 \leq \text{bucketBallNums}[i] \leq 10^9
  • 1bucketBallNums.length=N1051 \leq \text{bucketBallNums.length} = N \leq 10^5
  • 1maxCapacity1091 \leq \text{maxCapacity} \leq 10^9
  • 1SUM1091 \leq \text{SUM} \leq 10^9

样例1

输入

14 7
2 3 2 5 5 1 4

输出

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

说明

小球总数为 2222SUM=14\text{SUM} = 14,超出范围了,需从小桶取球:

  • maxCapacity=1\text{maxCapacity} = 1,取出球后,桶里剩余小球总和为 77,远小于 1414
  • maxCapacity=2\text{maxCapacity} = 2,取出球后,桶里剩余小球总和为 1313
  • maxCapacity=3\text{maxCapacity} = 3,取出球后,桶里剩余小球总和为 1616,大于 1414

因此 maxCapacity\text{maxCapacity}22,每个小桶小球数量大于 22 的都需要拿出来。

样例2

输入

3 3
1 2 3

输出

[0,1,2]

说明

小球总数为 66SUM=3\text{SUM} = 3,超出范围了,需从小桶中取球:

  • maxCapacity=1\text{maxCapacity} = 1,则小球总数为 33,从 11 号桶取 00 个球,22 号桶取 11 个球,33 号桶取 22 个球。

样例3

输入

6 2
3 2

输出

[]

说明

小球总数为 55SUM=6\text{SUM} = 6,在范围内,无需从小桶取球。