来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-number-of-eaten-apples

题目描述

有一棵特殊的苹果树,一连 n 天,每天都可以长出若干个苹果。在第 i 天,树上会长出 apples[i] 个苹果,这些苹果将会在 days[i] 天后(也就是说,第 i + days[i] 天时)腐烂,变得无法食用。也可能有那么几天,树上不会长出新的苹果,此时用 apples[i] == 0 且 days[i] == 0 表示。

你打算每天 最多 吃一个苹果来保证营养均衡。注意,你可以在这 n 天之后继续吃苹果。

给你两个长度为 n 的整数数组 days 和 apples ,返回你可以吃掉的苹果的最大数目。

示例 1:

输入:apples = [1,2,3,5,2], days = [3,2,1,4,2]
输出:7
解释:你可以吃掉 7 个苹果:
- 第一天,你吃掉第一天长出来的苹果。
- 第二天,你吃掉一个第二天长出来的苹果。
- 第三天,你吃掉一个第二天长出来的苹果。过了这一天,第三天长出来的苹果就已经腐烂了。
- 第四天到第七天,你吃的都是第四天长出来的苹果。

示例 2:

输入:apples = [3,0,0,0,0,2], days = [3,0,0,0,0,2]
输出:5
解释:你可以吃掉 5 个苹果:
- 第一天到第三天,你吃的都是第一天长出来的苹果。
- 第四天和第五天不吃苹果。
- 第六天和第七天,你吃的都是第六天长出来的苹果。

提示:

apples.length == n
days.length == n
1 <= n <= 2 * 104
0 <= apples[i], days[i] <= 2 * 104
只有在 apples[i] = 0 时,days[i] = 0 才成立

解题思路

本题使用贪心算法进行模拟求解,每次找到最快腐烂的苹果吃掉,并且扔掉已经腐烂的苹果,便可以使得吃的苹果数目最多(虽然可能永远吃不到新鲜苹果)

如果每一天都进行一次查找,时间复杂度会非常高,所以采用优先队列的方式,永远将快腐烂的苹果放在堆顶。

想法1.0:

首先将每天产生的苹果数量的腐烂日期一个一个的存入优先队列,然后寻找队列中腐烂的苹果扔掉,最后取堆顶的苹果吃掉,直到队列为空的那天为止。

由于一天可能产生的苹果数量也非常多,所以时间复杂度依然很高,不能将苹果一个一个存入优先队列。

想法2.0:

利用一个类来记录腐烂时间和数量,将产生的苹果打包直接全部放入优先队列中,然后寻找优先队列中已经腐烂的苹果包或者苹果包中没有苹果的苹果包丢掉,取出腐烂日期最近的苹果包吃一个再放入。直到队列中没有苹果包为止。

代码展示

class Solution {
public:
class Item
{
public:
int miDay;
int miCount;
Item(int iDay, int iCount)
{
this->miDay = iDay;
this->miCount = iCount;
}
bool operator<(const Item& other) const
{
return this->miDay > other.miDay;
}
}; int eatenApples(vector<int>& apples, vector<int>& days) { priority_queue<Item> pqiQueue;
int iDay = 0, iRet = 0;
while(iDay < apples.size() || !pqiQueue.empty())
{
if(iDay < apples.size())
{
pqiQueue.push(Item (iDay + days[iDay], apples[iDay]));
}
while(!pqiQueue.empty() && (pqiQueue.top().miDay <= iDay || pqiQueue.top().miCount < 1))
{
pqiQueue.pop();
}
if(!pqiQueue.empty())
{
Item zTemp = pqiQueue.top();
pqiQueue.pop();
zTemp.miCount--;
if(zTemp.miCount > 0)
{
pqiQueue.push(zTemp);
}
iRet++;
}
iDay++;
}
return iRet; }
};

运行结果

LeetCode-1705 吃苹果的最大数目的更多相关文章

  1. P1676陶陶吃苹果 - vijos

    描述 curimit知道陶陶很喜欢吃苹果.于是curimit准备在陶陶生日的时候送给他一棵苹果树. curimit准备了一棵这样的苹果树作为生日礼物:这棵苹果树有n个节点,每个节点上有c[i]个苹果, ...

  2. [Vijos 1676] 陶陶吃苹果

    Description curimit知道陶陶很喜欢吃苹果.于是curimit准备在陶陶生日的时候送给他一棵苹果树. curimit准备了一棵这样的苹果树作为生日礼物:这棵苹果树有n个节点,每个节点上 ...

  3. C# 多线程经典示例 吃苹果

    本文主要讲述了多线程开发中经典示例,通过本示例,可以加深对多线程的理解. 示例概述: 下面用一个模拟吃苹果的实例,说明C#中多线程的实现方法.要求开发一个程序实现如下情况:一个家庭有三个孩子,爸爸妈妈 ...

  4. Swift - 跳跃吃苹果游戏开发(SpriteKit游戏开发)

    下面通过一个样例演示如何实现飞行道具的生成,以及道具碰撞拾取. 样例说明: 1,屏幕从右到左不断地生成苹果飞过来(苹果高度随机) 2,点击屏幕可以让熊猫跳跃 3,熊猫碰到苹果,苹果消失 运行效果: 样 ...

  5. [LeetCode]1512. 好数对的数目

    给你一个整数数组 nums . 如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 . 返回好数对的数目. 示例 1: 输入:nu ...

  6. LEETCODE 1254 统计封闭岛屿的数目 Number of Closed Islands

    地址 https://leetcode-cn.com/contest/weekly-contest-162/problems/number-of-closed-islands/ 有一个二维矩阵 gri ...

  7. Leetcode 1254. 统计封闭岛屿的数目

    题目: 有一个二维矩阵 grid ,每个位置要么是陆地(记号为 0 )要么是水域(记号为 1 ). 我们从一块陆地出发,每次可以往上下左右 4 个方向相邻区域走,能走到的所有陆地区域,我们将其称为一座 ...

  8. leetcode 1301. 最大得分的路径数目

    地址 https://leetcode-cn.com/problems/number-of-paths-with-max-score/ 给你一个正方形字符数组 board ,你从数组最右下方的字符 ' ...

  9. 【LeetCode】999. Available Captures for Rook 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 四方向搜索 日期 题目地址:https://leetc ...

  10. [置顶] 请听一个故事------>你真的认为iPhone只是一部手机?苹果惊天秘密!!

    在网上看到的一篇小说,感觉有点意思,转载过来大家一起围观下,作者很幽默很风趣. 导读:iPhone的隐藏功能!Jobs的军方身份!图灵服毒自杀的传奇故事!中兴华为的神秘背景! 你真的认为iPhone只 ...

随机推荐

  1. Python matplotlib 学习——建立画布和坐标系

    #导入包import matplotlib.pyplot as plt #让图表在jupyter展示出来%matplotlib inline#解决中文乱码问题plt.rcParams["fo ...

  2. Prometheus及Grafana监控服务的安装使用

    说明 Prometheus 是一个开放性的监控解决方案,通过 Node Exporter 采集当前主机的系统资源使用情况,并通过 Grafana 创建一个简单的可视化仪表盘. docker 安装 pr ...

  3. python 学生管理系统 文件版 增删改查

    # 在程序开始之前完成数据的读取 # 存在着循环 # 循环的内容 # 将操作内容分解为函数 def sel_student(students_list): """ 查看所 ...

  4. MongoDB - 副本集简介

    简介 在 MongoDB 中,副本集指的是一组 MongoDB 服务器实例掌管同一个数据集,实例可以在不同的机器上. 其中一个用于处理写操作的是主节点(Primary),还有多个用于保存主节点的数据副 ...

  5. WireShark抓包入门教学

    wireshark抓包新手使用教程 Wireshark是非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息.常用于开发测试过程各种问题定位.本文主要内容包括: 1.Wiresha ...

  6. HBase详解(03) - HBase架构和数据读写流程

    RegionServer 架构 每个RegionServer可以服务于多个Region 每个RegionServer中有多个Store, 1个WAL和1个BlockCache 每个Store对应一个列 ...

  7. Java8时间日期处理新特性

    Java8时间日期处理新特性 简介 伴随lambda表达式.streams以及一系列小优化,Java 8 推出了全新的日期时间API.Java处理日期.日历和时间的不足之处:将 java.util.D ...

  8. 就dispatch_source_t写的计时器

    直接上干货,我这里用的是Xcode12.4,macOS:11.2.3 OC版本:               swift版本:        

  9. 梯度下降算法 Gradient Descent

    梯度下降算法 Gradient Descent 梯度下降算法是一种被广泛使用的优化算法.在读论文的时候碰到了一种参数优化问题: 在函数\(F\)中有若干参数是不确定的,已知\(n\)组训练数据,期望找 ...

  10. 基于 VScode 搭建 Matlab 运行环境

    插件 Matlab:代码高亮.语法检查.用户片段 matlab-formatter:代码格式化 Matlab Interactive Terminal:集成终端 配置 Matlab "fil ...