拉胡尔和安吉特是皇家餐厅仅有的两名服务员。今天,餐厅接到N个订单。当由不同的服务员处理并作为数组 A[]和B[]给出时,小费的数量可能会有所不同,这样如果Rahul接受第i个订单,他将获得A[i]卢比的小费,如果 Ankit接受这个订单,小费是B[i]卢比。为了最大化总小费价值,他们决定在自己之间分配订单。一份订单将只由一个人处理。此外,由于时间限制,Rahul 不能接受多于X 个订单,而 Ankit 不能接受多于Y 个订单。保证X + Y大于或等于N ,这意味着所有订单都可以由 Rahul 或 Ankit 处理。任务是在处理完所有订单后找出最大可能的总小费金额。
例子:
Input: N = 5, X = 3, Y = 3, A[] = {1, 2, 3, 4, 5}, B[] = {5, 4, 3, 2, 1}
Output: 21
Explanation:
Step 1: 5 is included from Ankit’s array
Step 2: 4 is included from Ankit’s array
Step 3: As both of them has same value 3 then choose any one of them
Step 4: 4 is included from Rahul’s array
Step 5: 5 is included from Rahul’s array
Therefore, the maximum possible amount of total tip money sums up to 21.
Input: N = 7, X = 3, Y = 4, A[] = {8, 7, 15, 19, 16, 16, 18}, B[] = {1, 7, 15, 11, 12, 31, 9}
Output: 110
朴素的方法:解决本文的朴素方法在上一篇文章中讨论过。
高效方法:思想是使用贪心技术来解决问题。根据 Rahul 的提示和 Ankit 的提示之间的差异对N 个订单进行降序排序。然后,遍历所有订单,如果可能的话,取第i个订单的最大尖端。请按照以下步骤解决问题:
- 将ans初始化为 0 以存储最大可能的提示。
- 创建大小为N的整数对向量V ,使得V[i]的第一个和第二个元素分别存储 Rahul 和 Ankit第i阶的尖端。
- 根据提示之间的差异按降序对向量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 现场工作专业课程和学生竞争性编程现场课程。