📌  相关文章
📜  通过将分子和分母 K 次加 1 来最大化 N 个给定分数的比率之和

📅  最后修改于: 2022-05-13 01:56:08.879000             🧑  作者: Mango

通过将分子和分母 K 次加 1 来最大化 N 个给定分数的比率之和

给定一个正整数K和一个由N个分数组成的{numerator, denominator}组成的数组arr[] ,任务是在将分子和分母分别增加1 , K 次后找到给定分数的比率之和。

例子:

方法:给定问题可以通过使用贪心方法来解决,其想法是在给定分数中增加该分数,其增量使分数的比率之和最大化。这个想法可以使用优先级队列来实现。请按照以下步骤解决问题:

  • 使用优先级队列初始化一个最大堆,例如PQ ,如果对范围[0, N)中的所有i值的第 i索引执行操作,该优先级队列存储的值将在总平均比率中递增。
  • 在优先级队列PQ中插入数组arr[]中分数的所有索引,分数的递增值。
  • 迭代范围[0, K – 1]并执行以下步骤:
    • 弹出PQ的顶部元素。
    • 增加当前弹出索引的分数。
    • 将数组arr[]中的所有当前分数插入优先级队列PQ中,分数的递增值。
  • 完成上述步骤后,打印priority_queue PQ中存储的所有分数的比率总和。

下面是上述方法的实现:

C++
// C++ program for the above approach
 
#include 
using namespace std;
 
// Function to increment the K fractions
// from the given array to maximize the
// sum of ratios of the given fractions
double maxAverageRatio(
    vector >& arr, int K)
{
    // Size of the array
    int N = arr.size();
 
    // Max priority queue
    priority_queue > q;
 
    // Iterate through the array
    for (int i = 0; i < N; i++) {
 
        // Insert the incremented value
        // if an operation is performed
        // on the ith index
        double extra
            = (((double)arr[i][0] + 1)
               / ((double)arr[i][1] + 1))
              - ((double)arr[i][0]
                 / (double)arr[i][1]);
        q.push(make_pair(extra, i));
    }
 
    // Loop to perform K operations
    while (K--) {
        int i = q.top().second;
        q.pop();
 
        // Increment the numerator and
        // denominator of ith fraction
        arr[i][0] += 1;
        arr[i][1] += 1;
 
        // Add the incremented value
        double extra
            = (((double)arr[i][0] + 1)
               / ((double)arr[i][1] + 1))
              - ((double)arr[i][0]
                 / (double)arr[i][1]);
 
        q.push(make_pair(extra, i));
    }
 
    // Stores the average ratio
    double ans = 0;
    for (int i = 0; i < N; i++) {
        ans += ((double)arr[i][0]
                / (double)arr[i][1]);
    }
 
    // Return the ratio
    return ans / N;
}
 
// Driver Code
int main()
{
    vector > arr
        = { { 1, 2 }, { 3, 5 }, { 2, 2 } };
    int K = 2;
 
    cout << maxAverageRatio(arr, K);
 
    return 0;
}


Javascript


输出:
0.783333

时间复杂度: O(K*log N)
辅助空间: O(N)