algorithm - 编程开发人员招聘挑战问题
问题描述
一家软件公司有 N 个团队。第i个团队有 B i个员工,总预算为 A i个货币单位。每个团队都必须在员工中平均分配预算。但对于某些团队来说,这是不可能的。因此,公司必须对其团队的预算进行修订。在一次修改中,要修改第i个团队的预算,前 i 个团队的预算必须增加 1。您的任务是找到所需的最小修改次数,以便对于每个团队,他们的预算在员工是可能的。
示例案例:(A 1 B 1 )、(A 2 B 2 )、(A 3 B 3 ):(1 1)、(3 7)、(5 4)。
解决方案是4。初始预算(1,3,5) -> (2,4,5) -> (5,7,8)
解决方案
给定的问题可以通过建设性的解决方案来解决。首先,让我们i nc i表示每个A i增加的数量,这样总和 ( A i + inc i ) 可以在B i 个员工中平均分配。这里要进行的两个观察是:
- ( A i + inc i ) mod B i应该等于 0 以使数量平均分配
- inc i <= inc i-1,因为我们总是从索引 1 开始以前缀方式增加预算,因此不可能有inc i > inc i-1因为inc i-1总是在inc i之前增加
使用这两个观察,我们可以开始从右到左迭代给定数组,并且在每一步我们确定inc i的值。inc i的值应为 ( c * B i - A i ),其中c是最小整数值,使得c * B i >= A i并且 ( c * B i - A i ) >= inc i+1可以在 O(1) 中计算的值,因为我们可以修改方程来估计c的值,-
- c >= (A i / B i )
- c >= (A i + inc i+1 ) / B i
因此c = max (ceil(A i / B i ), ceil((A i + inc i+1 ) / B i )
因此,给定解决方案的整体复杂度是O(n),最终解决方案是inc 1的值(假设 1-indexing)
推荐阅读
- javascript - ESLint:5.0.1 错误
- google-cloud-platform - 在 Google Composer 中使用插件使其崩溃
- leaflet - 当用户在地图外单击时,leafletDirectiveMarker 禁用焦点
- javascript - 在 Ember 类中使用变量来命名数组键
- c# - 验证 TCP 消息的传递
- android - Android Studio 无法识别 Windows 10 上的原始文件
- python - Selenium + Python:通过 click() 的下一个按钮
- google-app-maker - 列和行中的 Appmaker 数据
- sql - Aster UPDATE 列不存在
- python - Redisearch不能在集群中工作?