给定预算和拨款找到最大上限值

时间:2016-08-28 16:06:58

标签: algorithm data-structures

奖项委员会计划今年在其年度预算总额中提供n项研究经费。但是,预算减少到b美元。委员会成员决定通过对所有补助金适用最高限额c来影响最低补助金数量:计划高于c的每笔补助金现在都是c美元。帮助委员会选择合适的c值,使总补助金额等于新预算。

我无法理解在面试中被问到的这个问题。

2 个答案:

答案 0 :(得分:1)

当面对这样的问题时,你必须一步一步。此外,如果您无法理解所需要的内容,请向面试官要求澄清。很多时候,问题将是故意模糊的,以便面试官可以在尝试解决问题之前了解如何定义问题。作为应用程序开发人员,您的部分工作是在开始构建应用程序任务之前收集明确且完整的要求。

您需要b美元,并且您希望为之前批准的最高价值赠款提供资金,但每个奖金不超过c美元。显然,如果预算中剩余资金,自动批准的资金少于c美元。

首先,按美元金额递减对先前批准的拨款进行排序。也就是说,最高价值的授权将位于列表的前面。这样,您就可以批准尽可能多的最高价值拨款。

然后,从前面开始浏览列表,并批准拨款,将金额限制为不超过c美元。如果调整后的金额小于或等于剩余预算,则批准该补助金。

在伪代码中,它看起来像这样:

grants = all grants sorted by amount, in descending order
remaining_budget = b

for each grant in grants
    amount = grant.amount

    // cap the grant amount to no more than c
    if amount > c then
        amount = c

    if amount > remaining_budget then
        // grant not approved
    else
        // approve grant
        remaining_budget = remaining_budget - amount
end for

答案 1 :(得分:0)

import java.util.Arrays;

public class Solution {

static double findGrantsCap(double[] grantsArray, double newBudget) {
    int n = grantsArray.length;
    Arrays.sort(grantsArray); // sort array first
    double sum = 0;
    for (int i = 0; i < n; i++) {
        sum += grantsArray[i]; // if sum is less than newBudget return
    }

    if (sum < newBudget)
        return grantsArray[n - 1]; // return max grant that is last array index value.

    double cap = newBudget / n; // gives avg cap = 38
    double budget = newBudget;
    for (int i = 1; i < n; i++) {
        if (cap < grantsArray[i - 1])
            return cap;
        budget = budget - grantsArray[i - 1]; // 190 = 190 - 2
        cap = budget / (n - i); // . cap = 188-4 = 47
    }
    return cap;
}

public static void main(String[] args) {
    Solution s1 = new Solution();
    double arr[] = {2, 100, 50, 120, 1000};
    double budget = 190;
    double result = s1.findGrantsCap(arr, budget);
    System.out.println(" Cap is "+result);
  }
}

/*
Output
Cap is 47.0
*/