这是 Pramp 上的一个问题。问题:
<块引用>您的母校(即您所在的学院/大学)的奖项委员会要求您协助解决他们面临的预算分配问题。最初,委员会计划在今年给予 N 项研究资助。然而,由于开支削减,预算减少到新预算美元,现在他们需要重新分配拨款。委员会做出决定,他们希望通过对所有赠款设置最大上限来影响尽可能少的赠款接受者。最初计划高于上限的每笔赠款现在都将是上限美元。小于或等于上限的拨款显然不会受到影响。
给定一个数组 grantsArray 的原始授权和减少的授权 预算新预算,编写一个函数 findGrantsCap,在 最有效的方式是设置上限,以便最少数量的收件人 受到影响并且满足新的预算约束(即 N 重新分配的拨款等于新预算)。
分析您的解决方案的时间和空间复杂性。
这就是我的解决方案在 PHP 中的样子。
$grantsArray = [61, 56, 87, 93, 55, 27];
$newBudget = 170;
function findGrantsCap($grantsArray, $newBudget) : array {
$newArray = [];
foreach($grantsArray as $entry) {
if(!($entry <= $newBudget / count($grantsArray))) {
array_push($newArray, $newBudget / count($grantsArray));
} else {
array_push($newArray, $entry);
}
}
return $newArray;
}
print_r(findGrantsCap($grantsArray, $newBudget));
这是我的第一次尝试并且成功了。不过,我认为这本可以更好地解决。
我可以做些什么来改进我的代码?谢谢!
答案 0 :(得分:1)
您应该尝试减少重复计算,以便在 foreach
循环之前计算出最大预算。此外,与其使用 if
来检查它是否高于此值,不如使用 min
取最低的条目和最高预算
function findGrantsCap($grantsArray, $newBudget) : array {
$maxBudget = $newBudget / count($grantsArray);
$newArray = [];
foreach($grantsArray as $entry) {
$newArray[] = min ( $entry, $maxBudget);
}
return $newArray;
}