📜  最大小费计算器 | 2套

📅  最后修改于: 2021-10-25 06:48:45             🧑  作者: Mango

拉胡尔和安吉特是皇家餐厅仅有的两名服务员。今天,餐厅接到N个订单。当由不同的服务员处理并作为数组 A[]B[]给出时,小费的数量可能会有所不同,这样如果Rahul接受第i订单,他将获得A[i]卢比的小费,如果 Ankit接受这个订单,小费是B[i]卢比。为了最大化总小费价值,他们决定在自己之间分配订单。一份订单将只由一个人处理。此外,由于时间限制,Rahul 不能接受多于X 个订单,而 Ankit 不能接受多于Y 个订单。保证X + Y大于或等于N ,这意味着所有订单都可以由 Rahul 或 Ankit 处理。任务是在处理完所有订单后找出最大可能的总小费金额。

例子:

朴素的方法:解决本文的朴素方法在上一篇文章中讨论过。

高效方法:思想是使用贪心技术来解决问题。根据 Rahul 的提示和 Ankit 的提示之间的差异对N 个订单进行降序排序。然后,遍历所有订单,如果可能的话,取第i个订单的最大尖端。请按照以下步骤解决问题:

  • ans初始化为 0 以存储最大可能的提示。
  • 创建大小为N的整数对向量V ,使得V[i]的第一个第二个元素分别存储 Rahul 和 Ankiti阶的尖端。
  • 根据提示之间的差异按降序对向量V 进行排序。
  • 使用变量i遍历向量V
    • 如果Y的值是0或满足条件V [I]。首先≥V [I]。第二成立,那么通过添加1 V的值[I]。首先,以ANS和减小量X。
    • 否则,将V[i].second的值添加到ans并将Y减 1
  • 完成以上步骤后,打印 作为结果的ans 的值。

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
  
// Utility Compare function 
// for sorting the array
bool compare(pair p1, pair p2)
{
    return abs(p1.first - p1.second)
           > abs(p2.first - p2.second);
}
  
// Function to find the maximum possible amount of total
// tip money after processing all the orders
void maxTip(int A[], int B[], int X, int Y, int N)
{
    // Store all the N orders
    vector > tips(N);
  
    // Traverse all the orders and add them
    // to the vector, V
    for (int i = 0; i < N; i++) {
        tips[i].first = A[i];
        tips[i].second = B[i];
    }
  
    // Sort the vector in decreasing
      // order of absolute
    // difference of the tips value
    sort(tips.begin(), tips.end(), compare);
  
    // Store the required result
    int ans = 0;
  
    // Traverse all the orders
    for (int i = 0; i < N; i++) {
  
        // Check if Y is 0 or Rahul's tip value
        // is greater than or equal to that of Ankit
        if (Y == 0
            || (X > 0 && tips[i].first >= tips[i].second)) {
  
            // Update the overall result and
            // decrement X by 1
            ans += tips[i].first;
            X--;
        }
  
        else {
  
            // Update the overall result and
            // decrement Y by 1
            ans += tips[i].second;
            Y--;
        }
    }
  
    // Print the result
    cout << ans;
}
  
// Driver Code
int main()
{
    // Given input
    int N = 5, X = 3, Y = 3;
    int A[] = { 1, 2, 3, 4, 5 };
    int B[] = { 5, 4, 3, 2, 1 };
  
    // Function Call
    maxTip(A, B, X, Y, N);
  
    return 0;
}


输出
21

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

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程。