首页 > 解决方案 > 奖励预算削减 (PHP)

问题描述

这是Pramp的一个问题。问题:

您的母校(即您的学院/大学)的奖励委员会要求您帮助他们解决他们面临的预算分配问题。最初,委员会计划今年提供 N 项研究经费。然而,由于支出削减,预算减少到新预算美元,现在他们需要重新分配赠款。委员会做出决定,他们希望通过对所有赠款应用最高上限来影响尽可能少的赠款接受者。最初计划高于上限的每笔赠款现在将完全是上限美元。显然,小于或等于上限的赠款不会受到影响。

给定一个数组 grantsArray 原始赠款和减少的预算 newBudget,编写一个函数 findGrantsCap,它以最有效的方式找到一个上限,使得受影响的接受者数量最少并且满足新的预算约束(即 N 的总和重新分配的赠款等于 newBudget)。

分析解决方案的时间和空间复杂性。

这就是我的解决方案在 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));

这是我的第一次尝试,它奏效了。但是,我认为这本可以更好地解决。

我可以做些什么来改进我的代码吗?谢谢!

标签: phparraysalgorithm

解决方案


您应该尝试减少计算的重复,以便可以在foreach循环之前计算出最大预算。也不要if检查它是否高于这个值,然后使用min最低的条目和最大的预算

function findGrantsCap($grantsArray, $newBudget) : array {
    $maxBudget = $newBudget / count($grantsArray);
    $newArray = [];
    foreach($grantsArray as $entry) {
        $newArray[] = min ( $entry, $maxBudget);
    }
    return $newArray;
}

推荐阅读