鉴于两个数组苹果[]和天[]表示苹果的计数苹果树生产和天数,这些苹果是食用从我分别次天,任务是找到苹果一个人可以吃,如果最大数量该人一天最多只能吃一个苹果。
例子
Input: apples[] = { 1, 2, 3, 5, 2 }, days[] = { 3, 2, 1, 4, 2 }
Output: 7
Explanation:
On 1st day, person eats the apple produced by apple tree on the 1st day.
On 2nd day, person eats the apple produced by apple tree on the 2nd day.
On 3rd day, person eats the apple produced by apple tree on the 2nd day.
On 4th to 7th day, person eats the apple produced by apple tree on the 4th day.
Input: apples[] = { 3, 0, 0, 0, 0, 2 }, days[] = { 3, 0, 0, 0, 0, 2 }
Output: 5
方法:想法是吃掉最接近有效期的苹果。请按照以下步骤解决问题:
- 初始化priority_queue存储第i个白天和那些苹果的有效期限生产苹果的计数。
- 遍历这两个阵列和插入苹果的计数以及由苹果树上的第i个天产生的那些苹果的有效期限。
- 检查priority_queue顶部元素的到期日期是否已到期。如果发现为真,则从priority_queue中弹出元素。
- 否则,增加最大数量,并从priority_queue中减少苹果的数量。
- 最后,打印获得的最大计数。
下面是上述方法的实现:
C++
// C++ program of the above approach
#include
using namespace std;
// Function to find the maximum number of apples
// a person can eat such that the person eat
// at most one apple in a day.
int cntMaxApples(vector apples, vector days)
{
// Stores count of apples and number
// of days those apples are edible
typedef pair P;
// Store count of apples and number
// of days those apples are edible
priority_queue, greater
> pq;
// Stores indices of the array
int i = 0;
// Stores count of days
int n = apples.size();
// Stores maximum count of
// edible apples
int total_apples = 0;
// Traverse both the arrays
while (i < n || !pq.empty()) {
// If top element of the apple
// is not already expired
if (i < n && apples[i] != 0) {
// Insert count of apples and
// their expiration date
pq.push({ i + days[i] - 1, apples[i] });
}
// Remove outdated apples
while (!pq.empty() && pq.top().first < i) {
pq.pop();
}
// Insert all the apples produces by
// tree on current day
if (!pq.empty()) {
// Stores top element of pq
auto curr = pq.top();
// Remove top element of pq
pq.pop();
// If count of apples in curr
// is greater than 0
if (curr.second > 1) {
// Insert count of apples and
// their expiration date
pq.push({ curr.first,
curr.second - 1 });
}
// Update total_apples
++total_apples;
}
// Update index
++i;
}
return total_apples;
}
// Driver Code
int main()
{
vector apples = { 1, 2, 3, 5, 2 };
vector days = { 3, 2, 1, 4, 2 };
cout << cntMaxApples(apples, days);
return 0;
}
Python3
# Python3 program of the above approach
# Function to find the maximum number of apples
# a person can eat such that the person eat
# at most one apple in a day.
def cntMaxApples(apples, days) :
# Store count of apples and number
# of days those apples are edible
pq = []
# Stores indices of the array
i = 0
# Stores count of days
n = len(apples)
# Stores maximum count of
# edible apples
total_apples = 0
# Traverse both the arrays
while (i < n or len(pq) > 0) :
# If top element of the apple
# is not already expired
if (i < n and apples[i] != 0) :
# Insert count of apples and
# their expiration date
pq.append([i + days[i] - 1, apples[i]])
pq.sort()
# Remove outdated apples
while (len(pq) > 0 and pq[0][0] < i) :
pq.pop(0)
# Insert all the apples produces by
# tree on current day
if (len(pq) > 0) :
# Stores top element of pq
curr = pq[0]
# Remove top element of pq
pq.pop(0)
# If count of apples in curr
# is greater than 0
if (len(curr) > 1) :
# Insert count of apples and
# their expiration date
pq.append([curr[0], curr[1] - 1])
pq.sort()
# Update total_apples
total_apples += 1
# Update index
i += 1
return total_apples
apples = [ 1, 2, 3, 5, 2 ]
days = [ 3, 2, 1, 4, 2 ]
print(cntMaxApples(apples, days))
# This code is contributed by divyesh072019
C#
// C# program of the above approach
using System;
using System.Collections.Generic;
class GFG {
// Function to find the maximum number of apples
// a person can eat such that the person eat
// at most one apple in a day.
static int cntMaxApples(int[] apples, int[] days)
{
// Store count of apples and number
// of days those apples are edible
List> pq = new List>();
// Stores indices of the array
int i = 0;
// Stores count of days
int n = apples.Length;
// Stores maximum count of
// edible apples
int total_apples = 0;
// Traverse both the arrays
while (i < n || pq.Count > 0) {
// If top element of the apple
// is not already expired
if (i < n && apples[i] != 0) {
// Insert count of apples and
// their expiration date
pq.Add(new Tuple(i + days[i] - 1, apples[i]));
pq.Sort();
}
// Remove outdated apples
while (pq.Count > 0 && pq[0].Item1 < i) {
pq.RemoveAt(0);
}
// Insert all the apples produces by
// tree on current day
if (pq.Count > 0) {
// Stores top element of pq
Tuple curr = pq[0];
// Remove top element of pq
pq.RemoveAt(0);
// If count of apples in curr
// is greater than 0
if (curr.Item2 > 1) {
// Insert count of apples and
// their expiration date
pq.Add(new Tuple(curr.Item1, curr.Item2 - 1));
pq.Sort();
}
// Update total_apples
++total_apples;
}
// Update index
++i;
}
return total_apples;
}
// Driver code
static void Main() {
int[] apples = { 1, 2, 3, 5, 2 };
int[] days = { 3, 2, 1, 4, 2 };
Console.Write(cntMaxApples(apples, days));
}
}
// This code is contributed by divyeshrabadiya07.
7
时间复杂度: O(NlogN)
辅助空间: O(N)