Leetcode 1705. 吃苹果的最大数目 (贪心思想,优先队列,每次吃最接近要过期的苹果)

贪心算法 第1讲: 分配问题 一、什么是贪心算法贪心算法是一种对某些求优解问题的更简单、更迅速的设计技术。 贪心算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作优选择,而不考虑各种可能的整体情况,省去了为找优解要穷尽所有可能而必须耗费的大量时间。 贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择,就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个优解。 虽然每一步上都要保证能获得局部优解,但由此产生的全局解有时不一定是优的,所以贪心算法不要回溯 。 举一个 阅读详情

 

思路是贪心的思想,维护一个优先队列,里面按照过期时间,从小到大排序,每次挑一个快要过期的苹果吃,这样的吃法总是最优先的。

注意在吃之前,需要跟新优先队列的信息,将过期苹果剔除优先队列。

注意:当没有新苹果加入后,还是可以把老苹果吃完。

using PII = pair<int,int>;

class Solution {
public:
    int eatenApples(vector<int>& apples, vector<int>& days) {
        int ans = 0;
        priority_queue<PII, vector<PII>, greater<PII>> pq;
        int n = apples.size();
        int i = 0;
        while (i < n) {
            while(!pq.empty() && pq.top().first <= i) {
                pq.pop();
            }
            int rottenDay = i + days[i];
            int count = apples[i];
            if (count) {
                pq.emplace(rottenDay, count);
            }
            if (!pq.empty()) {
                auto tmp = pq.top(); pq.pop();
                tmp.second -= 1;
                if (tmp.second) {
                    pq.emplace(tmp);
                }
                ans++;
            }
            i++;
        }
        while (!pq.empty()) {
            while(!pq.empty() && pq.top().first <= i) {
                pq.pop();
            }
            if (!pq.empty()) {
                auto tmp = pq.top(); pq.pop();
                tmp.second -= 1;
                if (tmp.second) {
                    pq.emplace(tmp);
                }
                ans++;
            }
            i++;
        }
        return ans;
    }
};

【优先级队列+贪心leetcode1075.吃苹果最大数目 题目: 有一棵特殊的苹果树,一连 n 天,每天都可以长出若干个苹果。在第 i 天,树上会长出 apples[i] 个苹果,这些苹果将会在 days[i] 天后(也就是说,第 i + days[i] 天时)腐烂,变得无法食用。也可能有那么几天,树上不会长出新的苹果,此时用 apples[i] == 0 且 days[i] == 0 表示。 你打算每天 一个苹果来保证营养均衡。注意,你可以在这 n 天之后继续吃苹果。 给你两个长度为 n 的整数数组 days 和 apples ,返回你可以掉的苹果 阅读详情

相关推荐

22.3.5

1,合并集合 对find函数(递归)的深入理解 2,小朋友的数字 特征值的求法,是连续的区间最大和!不是只取正值,积累起来的和!!; 可以dp求特征值,也可以维护一可更新的最大值; 关键是:能够发现特征值是单调递增的!!它总是tt[i] >= tt[i-1]; 根据这个,在求分数的时候,可以贪心来做;贪心思想就是tt[i-1]<0,那么最大分数值只能是fs[2],只要tt[i-1]>0,就可以fs[i]= fs[i-1] + tt[i-1] ; 所以其实分数也是具有单调性的

aidaqiudeaichao的博客 1016

吃苹果最大数目优先队列+贪心

题目是P1705吃苹果最大数目 分析,对于每个已经收获的苹果,我们的决策总是先腐烂时间早的,因此我们用优先队列存储二元组[苹果数量,腐烂时间],同时每次的时候我们考虑优先队列的头部,如果头部的苹果不满足要求,我们就直接丢掉,继续查看头部,直到满足要求的苹果出现或者队列为空,代码如下: struct cmp{ bool operator()(const pair<int,int>&a,const pair<int,int>&b){ re

peko1的博客 633

吃苹果最大数目-c语言贪心算法

吃苹果最大数目-c语言贪心算法 有一棵特殊的苹果树,一连 n 天,每天都可以长出若干个苹果。在第 i 天,树上会长出 apples[i] 个苹果,这些苹果将会在 days[i] 天后(也就是说,第 i + days[i] 天时)腐烂,变得无法食用。也可能有那么几天,树上不会长出新的苹果,此时用 apples[i] == 0 且 days[i] == 0 表示。 你打算每天 一个苹果来保证营养均衡。注意,你可以在这 n 天之后继续吃苹果。 给你两个长度为 n 的整数数组 days 和 apples

weixin_43327597的博客 685

LeetCode 1705 吃苹果最大数目[贪心 优先队列] HERODING的LeetCode之路

解题思路: 这是一道很典型的贪心题目,只要每次的都是先要腐烂的苹果,那么一定能够保证多的苹果,而且当前只知道目前所拥有的苹果的腐烂时间,之后要收集的苹果和其腐烂时间是不知道的。定义一个优先队列,以腐烂日期新为排序条件,遍历每一天,先判断是否有苹果可放入,接着丢弃掉腐烂的苹果后再吃苹果,由于过了n天还有苹果,所以要符合判断条件,遍历到n天后还有苹果就继续往下走,代码如下: class Solution { public: int eatenApples(vector<i.

HERODING23的博客 690

[LeetCode]1705.吃苹果最大数目

[LeetCode]1705.吃苹果最大数目题目示例方法贪心 题目 有一棵特殊的苹果树,一连 n 天,每天都可以长出若干个苹果。在第 i 天,树上会长出 apples[i] 个苹果,这些苹果将会在 days[i] 天后(也就是说,第 i + days[i] 天时)腐烂,变得无法食用。也可能有那么几天,树上不会长出新的苹果,此时用 apples[i] == 0 且 days[i] == 0 表示。 你打算每天 一个苹果来保证营养均衡。注意,你可以在这 n 天之后继续吃苹果。 给你两个长度为 n 的整

qq_47875463的博客 456

平安夜关于苹果的题目——1705. 吃苹果最大数目

文章目录题目题目解析解题代码 题目 OJ平台 题目解析 题目给出的数据是每天生产出来的苹果数量,以及该苹果对应的过期时间,而题目通过限制每天只能一个苹果后问多能多少个苹果? 很明显,这是一道模拟题,我们模拟从第0天到后,每天一个苹果能延续到第几天,就是能多少个苹果。 我们如何模拟呢? 我们需要维护一个二元关系的元素->[过期时间,苹果数量],由于是根据时间来遍历,所以过期时间我们可以正常的算出来,而且也很好判断是否过期。这个时候取苹果就是根据这个过期时间的远近来取的,这也是这题贪心

CppYyds的博客 1176

力扣OJ(1601-2000)

目录 1602. 找到二叉树中近的右侧节点 1612. 检查两棵二叉表达式树是否等价 1634. 求两个多项式链表的和 1644. 二叉树的近公共祖先 II 1650. 二叉树的近公共祖先 III 1666. 改变二叉树的根节点 1676. 二叉树的近公共祖先 IV 1602. 找到二叉树中近的右侧节点 二叉树 1612. 检查两棵二叉表达式树是否等价 二叉表达式树是一种表达算术表达式的二叉树。二叉表达式树中的每一个节点都有零个或两个子节点。叶节点(有 0 个子节点的节.

nameofcsdn的博客 2511

Leetcode刷题心得

目录1. 动态规划1.1 背包问题1.1 01背包问题805. 均值分割1.2 完全背包问题377. 组合总和IV518. 零钱兑换Ⅱ1.2 一维DP1.3 二维DP97. 交错字符串72. 编辑距离115. 不同子序列1.3. 三维DP87. 扰乱字符串1.4 线性DP10. 正则表达式匹配44. 通配符匹配300. 长递增子序列(注意贪心的做法)354. 俄罗斯套娃信封问题714. 买卖股票的佳时机含手续费887. 鸡蛋掉落940. 不同的子序列1092. 短公共超序列1463. 摘樱桃Ⅰ1696

weixin_43684773的博客 689

leetcode:吃苹果最大数目小堆+贪心

我的思路: 给活着的苹果记录下来,每天更新 很不幸,超时了 我的初代暴力代码: class Solution: def eatenApples(self, apples: List[int], days: List[int]) -> int: # 每天都快要过期苹果? cur = [] ans = 0 maxn = 0 for i in range(len(apples)): ma.

小楼一夜听春雨 521

9506 水果(贪心算法

时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G++;GCC Description Mr.chen买来了许许多多的水果来给那些acmers,但是由于近大家都忙于比赛,所以呢只留下zyq在机房切题 但是lyd师兄十分喜欢水果,所以呢,就规定zyq一天只能一个。 每一个水果重量wi都不一定是一样的,而且都有一个食用期限ti。必须是在...

zg 966

leetcode刷题班】贪心题目求解

leetcode455、分糖果(easy) 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj &gt;= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大...

littlemichelle 1151

A - Watermelon

A - Watermelon Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description One hot summer day Pete and his friend Billy decided to buy a wate

Domacles 1155

牛客练习赛61 水果 思维

题目链接 题意: 给你n个香蕉,m个苹果。你有两种操作 1.任选一个水果将它们翻倍。 2.同时掉一个香蕉和一个苹果。 你必须同时使n和m变成0. 问如何操作才能使总操作次数少。 思路: bfs当然可以解决, 但是超时。 根据题意 我们要尽量构造 n == m的情况 ,如果一开始不相等,只有通过n * 2 来实现 n == m 那么可以想到,当2 * n > m的时候,我们就得执行–操作了...

weixin_43960370的博客 473

C++中pair的用法

pair是C++中一种模板类型。每个pair对象可以存储两个值,这两个值可以是不同的数据类型。存储的值可以是基本数据类型也可以是自定义数据类型。 声明命名空间: using namespace std; 或 using std::pair; pair pdata; 或使用全名 std::pair pdata; 一、定义和初始化 pair p1(1, 2); pair p2(p

EmSoftEn的专栏 5526

leetcode 吃苹果最大数目

题目链接 数据结构:小根堆 思路:每次往小根堆中插入一个Apple,按照Apple的剩余保质天数插入。每天只能小根堆的保质期少的那个Apple,即堆顶的num-1即可。(思路简单,但是代码细节方面要很小心,可以尝试先自己实现一下思路)。这里将days进行了一些处理,即将days处理成,第几天过期,而不是开始的还有几天过期,即days[i]表示第i天的苹果,第days[i]过期。 代码: class Solution { class Apple{ int num; in

weixin_42496727的博客 273

1705. 吃苹果最大数目贪心优先队列(堆)、哈希表),总之先快烂的苹果

1705. 吃苹果最大数目 题干 有一棵特殊的苹果树,一连 n 天,每天都可以长出若干个苹果。在第 i 天,树上会长出 apples[i] 个苹果,这些苹果将会在 days[i] 天后(也就是说,第 i + days[i] 天时)腐烂,变得无法食用。也可能有那么几天,树上不会长出新的苹果,此时用 apples[i] == 0 且 days[i] == 0 表示。 你打算每天 一个苹果来保证营养均衡。注意,你可以在这 n 天之后继续吃苹果。 给你两个长度为 n 的整数数组 days 和 apple

此心安处 772

1705. 吃苹果最大数目(贪心算法)

1705. 吃苹果最大数目 难度中等104 有一棵特殊的苹果树,一连 n 天,每天都可以长出若干个苹果。在第 i 天,树上会长出 apples[i] 个苹果,这些苹果将会在 days[i] 天后(也就是说,第 i + days[i] 天时)腐烂,变得无法食用。也可能有那么几天,树上不会长出新的苹果,此时用 apples[i] == 0 且 days[i] == 0 表示。 你打算每天 一个苹果来保证营养均衡。注意,你可以在这 n 天之后继续吃苹果。 给你两个长度为 n 的整数数组 days 和 a

ahelloyou的博客 798

力扣(合并区间)

给定一组可能重叠或相邻的整数区间,合并所有重叠或端点相接的区间,返回不重叠的小区间列表。例如输入 [[1,3],[2,6],[8,10],[15,18]],输出 [[1,6],[8,10],[15,18]]。核心是先按左端点升序排序,再单次线性扫描完成合并,避免暴力两两比较。

weixin_52811458的博客 289
上一篇: Leetcode 825. 适龄的朋友 (双指针,单调性, 桶排序优化)
下一篇: 2022考研数一大题解答
wwxy261
博客等级 码龄11年 1075粉丝 · 3690原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值