返回顶部
首页 > 资讯 > 数据库 >【算法】反悔贪心
  • 565
分享到

【算法】反悔贪心

算法反悔贪心贪心 2023-09-12 07:09:44 565人浏览 独家记忆
摘要

文章目录 反悔贪心力扣题目列表630. 课程表 III871. 最低加油次数LCP 30. 魔塔游戏2813. 子序列最大优雅度 洛谷题目列表P2949 [USACO09OPEN] Wor

文章目录

反悔贪心

思路是无论当前的选项是否最优都接受,然后进行比较,如果选择之后不是最优了,则反悔,舍弃掉这个选项;否则,正式接受。如此往复。

力扣题目列表

630. 课程表 III

https://leetcode.cn/problems/course-schedule-iii/description/?envType=daily-question&envId=2023-09-11

在这里插入图片描述

提示:
1 <= courses.length <= 104
1 <= durationi, lastDayi <= 104

解法看注释就很清楚了。
在这里插入图片描述

class Solution {    public int scheduleCourse(int[][] courses) {        // 按照截止时间从小到大排序        Arrays.sort(courses, (a, b) -> a[1] - b[1]);        // 最大堆        PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> b - a);        int day = 0;        // 记录当前使用了多少天        for (int[] c: courses) {            int d = c[0], t = c[1];            if (day + d <= t) {                // 如果可以学,直接学                day += d;                pq.offer(d);            } else if (!pq.isEmpty() && pq.peek() > d) {                // 如果不可以学,检查已经选了的课程中有没有耗时更长的替换掉                day -= pq.poll() - d;                pq.offer(d);            }        }        // 最后的答案就是队列中已选课程的数量        return pq.size();    }}

871. 最低加油次数

https://leetcode.cn/problems/minimum-number-of-refueling-stops/

在这里插入图片描述
提示:
1 <= target, startFuel <= 10^9
0 <= stations.length <= 500
1 <= positioni < positioni+1 < target
1 <= fueli < 10^9

按照加油站的出现顺序排序。
用堆维护目前可以加的油,每次路过一个加油站先不加而是放入优先队列中,等到走不动了再一个个从大到小加油。

class Solution {    public int minRefuelStops(int target, int startFuel, int[][] stations) {        // 按照出现顺序排序        Arrays.sort(stations, (a, b) -> a[0] - b[0]);        PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> b - a);        int ans = 0, pos = startFuel;        for (int[] s: stations) {            if (pos >= target) return ans;            int p = s[0], f = s[1];            while (pos < p && !pq.isEmpty()) {                pos += pq.poll();                ans++;            }            if (pos < p) return -1;            else pq.offer(f);        }        while (pos < target && !pq.isEmpty()) {            pos += pq.poll();            ans++;        }        return pos < target? -1: ans;    }}

LCP 30. 魔塔游戏

https://leetcode.cn/problems/p0NxJO/
在这里插入图片描述

提示:
1 <= nums.length <= 10^5
-10^5 <= nums[i] <= 10^5

先检查是否可以访问完全部房间,如果不可以直接返回-1。
如果不可以,每次遇到负数先放入优先队列中去,当血量不够时,再依次从小到大取出堆中的负数调换到队尾。

class Solution {    public int magicTower(int[] nums) {        if (Arrays.stream(nums).sum() < 0) return -1;        int ans = 0;        // pq中存放目前遇到的负数        PriorityQueue<Integer> pq = new PriorityQueue<>();        long s = 1;        for (int x: nums) {            s += x;            if (x < 0) pq.offer(x);            while (s <= 0) {                // 每次把最小的移动到最后面去                s -= pq.poll();                ans++;            }        }        return ans;    }}

2813. 子序列最大优雅度

https://leetcode.cn/problems/maximum-elegance-of-a-k-length-subsequence/description/

在这里插入图片描述

提示:
1 <= items.length == n <= 10^5
items[i].length == 2
items[i][0] == profiti
items[i][1] == cateGoryi
1 <= profiti <= 10^9
1 <= categoryi <= n
1 <= k <= n

按照利润从大到小排序。
i < k 时直接加入,如果有重复的类别就将当前元素放入栈中(因为是从大到小枚举,所以栈顶一定是利润最小的)
当 i > k 时,如果当前元素还没有出现过,就可以尝试替换掉重复类型中利润最小的元素。

class Solution {    public long findMaximumElegance(int[][] items, int k) {        // 按利润从大到小排序        Arrays.sort(items, (a, b) -> b[0] - a[0]);        long ans = 0, totalProfit = 0;        Set<Integer> s = new HashSet<>();        Deque<Integer> stk = new ArrayDeque<>();        for (int i = 0; i < items.length; ++i) {            int p = items[i][0], c = items[i][1];            if (i < k) {                totalProfit += p;                if (s.contains(c)) stk.push(p);                s.add(c);            } else if (!stk.isEmpty() && !s.contains(c)) {                totalProfit -= stk.pop() - p;                s.add(c);            }            ans = Math.max(ans, totalProfit + (long)s.size() * s.size());        }        return ans;    }}

注意代码中的 s.add(c); 不能提出 if-else 之外,否则会影响答案。

洛谷题目列表

P2949 [USACO09OPEN] Work Scheduling G

https://www.luogu.com.cn/problem/P2949
在这里插入图片描述

import java.util.*;class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int n = sc.nextInt();        int[][] g = new int[n][2];        for (int i = 0; i < n; ++i) {            g[i][0] = sc.nextInt();            g[i][1] = sc.nextInt();        }        // 按照截止时间从小到大排序        Arrays.sort(g, (a, b) -> a[0] - b[0]);        long ans = 0;        PriorityQueue<Integer> pq = new PriorityQueue<>();        for (int[] p: g) {            // 如果当前工作不超时  加入答案和优先队列中            if (pq.size() < p[0]) {                pq.offer(p[1]);                ans += p[1];            } else if (!pq.isEmpty() && p[1] > pq.peek()) {                // 当前工作超时 和已经选了的工作中最小的交换                ans += p[1] - pq.poll();                pq.offer(p[1]);            }        }        System.out.println(ans);    }}

P1209 [USACO1.3] 修理牛棚 Barn Repair

https://www.luogu.com.cn/problem/P1209

在这里插入图片描述
在这里插入图片描述

记得要对输入数据排序!

import java.io.BufferedInputStream;import java.lang.reflect.Array;import java.util.*;public class Main {    public static void main(String[] args) {        Scanner sin = new Scanner(new BufferedInputStream(System.in));        int m = sin.nextInt(), s = sin.nextInt(), c = sin.nextInt();        PriorityQueue<Long> pq = new PriorityQueue<>();        int[] a = new int[c];        long last = -1, ans = c;        m--;        for (int i = 0; i < c; ++i) {            a[i] = sin.nextInt();        }        Arrays.sort(a);        for (int i = 0; i < c; ++i) {            int p = a[i];            if (last != -1 && last < p - 1) {                pq.add(p - last - 1);                m--;            }            last = p;        }        while (m < 0 && !pq.isEmpty()) {            m++;            ans += pq.poll();        }        System.out.println(ans);    }}

每次将空格记录在优先队列中,当木板数量不够时,从小到大取出优先队列中的空格依次填上。

P2123 皇后游戏(🚹省选/NOI− TODO)

https://www.luogu.com.cn/problem/P2123
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入代码片

相关链接

【力扣周赛】第 357 场周赛(⭐反悔贪心)

来源地址:https://blog.csdn.net/qq_43406895/article/details/132805232

您可能感兴趣的文档:

--结束END--

本文标题: 【算法】反悔贪心

本文链接: https://lsjlt.com/news/404134.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 【算法】反悔贪心
    文章目录 反悔贪心力扣题目列表630. 课程表 III871. 最低加油次数LCP 30. 魔塔游戏2813. 子序列最大优雅度 洛谷题目列表P2949 [USACO09OPEN] Wor...
    99+
    2023-09-12
    算法 反悔贪心 贪心
  • 贪心算法(贪婪算法)
    贪心算法(贪婪算法) 文章目录 **贪心算法思想**选择排序平衡字符串买卖股票的最佳时机跳跃游戏钱币找零多机器调度问题举办活动数量最多无重叠区间 贪心算法思想 ​ 1.贪心算法(又称贪婪算法)是指,在对问题求解时,总是...
    99+
    2023-08-21
    贪心算法 算法 java 数据结构
  • 贪心算法是什么
    本篇文章给大家分享的是有关贪心算法是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1 概念贪心的意思在于在作出选择时,每次都要选择对自身最为有利的结果,保证自身利益的最大化...
    99+
    2023-06-19
  • C++算法精讲之贪心算法
    目录选择排序平衡字符串买股票的最佳时机跳跃游戏钱币找零多机调度问题活动选择无重叠区间选择排序 我们熟知的选择排序,其采用的就是贪心策略。 它所采用的贪心策略即为每次从未排序的数据中选...
    99+
    2024-04-02
  • 贪心算法①--使用贪心算法思想解活动安排问题-python
    '''一、具有贪心选择结构 复杂问题可以划分成小问题解决二、具有贪心选择性质 是否能够用贪心选择开始一个最优起点,使用贪心选择能否得到一个完整解案例1:最优装载问题 有n个集装箱需要装上一艘重量为W的轮船。 其中...
    99+
    2023-10-26
    贪心算法 python 算法 数据结构 pycharm
  • 如何使用贪心算法
    这篇文章主要讲解了“如何使用贪心算法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用贪心算法”吧!活动规则客户购买 X 瓶酒,就可以用 Y 个空酒瓶来...
    99+
    2024-04-02
  • 怎么使用Java贪心算法
    这篇文章主要介绍“怎么使用Java贪心算法”,在日常操作中,相信很多人在怎么使用Java贪心算法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Java贪心算法”的疑惑...
    99+
    2024-04-02
  • 怎么使用Python贪心算法
    这篇文章主要介绍“怎么使用Python贪心算法”,在日常操作中,相信很多人在怎么使用Python贪心算法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Python贪心算法”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-16
  • 如何理解java贪心算法
    今天就跟大家聊聊有关如何理解java贪心算法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。算法简介1)贪心算法是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选...
    99+
    2023-06-21
  • 柠檬水找零【贪心算法-】
    柠檬水找零 在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。 每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交...
    99+
    2023-08-30
    算法
  • C++贪心算法怎么应用
    今天小编给大家分享一下C++贪心算法怎么应用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。选择排序我们熟知的选择排序,其采用...
    99+
    2023-06-29
  • Java贪心算法实例分析
    这篇“Java贪心算法实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java贪心算法实例分析”文章吧。贪心算法贪心算...
    99+
    2023-06-29
  • C++算法学习之贪心算法的应用
    目录贪心1实验题目:减肥的小K1实验题目:最小跳数实验题目:排队接水贪心-堂练实验题目: 区间问题1实验题目:种树实验题目:智力大冲实验题目:删除数字II贪心1 实验题目:减肥的小K...
    99+
    2024-04-02
  • Python实现贪心算法的示例
    目录一、贪心算法简介二、解决思路1.同学导师给的思路2.问题分解三、算法代码实现四、算法测试结果五、算法复杂性分析今天一个研究生同学问我一个问题,问题如下: 超市有m个顾客要结账,每...
    99+
    2024-04-02
  • Java贪心算法超详细讲解
    目录什么是贪心算法通过场景理解算法问题分析总结什么是贪心算法 在分析和求解某个问题时,在每一步的计算选择上都是最优的或者最好的,通过这种方式期望最终的计算的结果也是最优的。也就是说,...
    99+
    2024-04-02
  • C++贪心算法实现马踏棋盘
    本文实例为大家分享了C++贪心算法实现马踏棋盘的具体代码,供大家参考,具体内容如下 算法实现流程: 步骤1:初始化马的位置(结构体horse {x, y}) 步骤2:确定马从当前点...
    99+
    2024-04-02
  • Python 经典贪心算法之Prim算法案例详解
    最小生成树的Prim算法也是贪心算法的一大经典应用。Prim算法的特点是时刻维护一棵树,算法不断加边,加的过程始终是一棵树。 Prim算法过程: 一条边一条边地加, 维护一棵树。 初...
    99+
    2024-04-02
  • C++实现贪心算法的示例详解
    目录区间问题区间选点最大不相交区间数量区间分组区间覆盖Huffman树合并果子排序不等式排队打水绝对值不等式货舱选址区间问题 区间选点 给定 N 个闭区间 [ai,bi],请你在数轴...
    99+
    2024-04-02
  • 贪心算法之如何实现K次取反后最大化的数组和
    本篇内容主要讲解“贪心算法之如何实现K次取反后最大化的数组和”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“贪心算法之如何实现K次取反后最大化的数组和”吧!很多录...
    99+
    2024-04-02
  • Java 数据结构与算法系列精讲之贪心算法
    概述 从今天开始, 小白我将带大家开启 Java 数据结构 & 算法的新篇章. 贪心算法 贪心算法 (Greedy Algorithm) 指的是在每一步选择中都采取在当前状...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作