【算法】反悔贪心

文章目录

  • 反悔贪心
  • 力扣题目列表
    • 630. 课程表 III
    • 871. 最低加油次数
    • LCP 30. 魔塔游戏
    • 2813. 子序列最大优雅度
  • 洛谷题目列表
    • P2949 [USACO09OPEN] Work Scheduling G
    • P1209 [USACO1.3] 修理牛棚 Barn Repair
    • P2123 皇后游戏(🚹省选/NOI− TODO)
  • 相关链接

反悔贪心

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

力扣题目列表

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 场周赛(⭐反悔贪心)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/107240.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Anaconda彻底卸载及重安装

一、彻底卸载Anaconda 1.1 先采用anaconda-clean包初步卸载 总体卸载思路&#xff1a;通过下载anaconda-clean包完成初步卸载&#xff0c;但由于在base下若下载anaconda-clean包会一直卡在Solving environment:阶段&#xff0c;因此首先要创建一个虚拟环境。具体步骤如下&…

ARM Linux DIY(八)USB 调试

前言 V3s 带有一个 USB 接口&#xff0c;将其设置为 HOST 或 OTG 模式&#xff0c;这样可以用来接入键盘、鼠标等 USB 外设。 USB 简介 USB 有两种设备&#xff1a;HOST 和 USB 功能设备。 在 USB2.0 中又引入了一个新的概念 OTG&#xff0c;即设备角色可以动态切换。 切换方…

安全基础 --- 原型链污染

原型链 大部分面向对象的编程语言&#xff0c;都是通过“类”&#xff08;class&#xff09;实现对象的继承。传统上&#xff0c;JavaScript 语言的继承不通过 class&#xff0c;而是通过“原型对象”&#xff08;prototype&#xff09;实现 1、prototype 属性的作用 JavaScri…

第三节:在WORD为应用主窗口下关闭EXCEL的操作(2)

【分享成果&#xff0c;随喜正能量】凡事好坏&#xff0c;多半自作自受&#xff0c;既不是神为我们安排&#xff0c;也不是天意偏私袒护。业力之前&#xff0c;机会均等&#xff0c;毫无特殊例外&#xff1b;好坏与否&#xff0c;端看自己是否能应机把握&#xff0c;随缘得度。…

数据结构与算法(一)数组的相关概念和底层java实现

一、前言 从今天开始&#xff0c;笔者也开始从0学习数据结构和算法&#xff0c;但是因为这次学习比较捉急&#xff0c;所以记录的内容并不会过于详细&#xff0c;会从基础和底层代码实现以及力扣相关题目去写相关的文章&#xff0c;对于详细的概念并不会过多讲解 二、数组基础…

安科瑞铁塔基站能耗监控解决方案

安科瑞 华楠 1 背景概述 5G发展&#xff0c;基站先行。5G基站的选址建设&#xff0c;是保证5G信号覆盖的基础&#xff0c;因此5G基站建设是5G产业布局的一部分&#xff0c;也是5G成熟的基础。 2G、3G、4G均是低频段信号传输&#xff0c;宏基站几乎能应付所有的信号覆盖。但由…

【MFC】tab控件 仿任务管理器 枚举窗口和进程

界面和关联变量设置 创建一个基于对话框的MFC项目&#xff0c;给主对话框添加一个tab控件&#xff08;设置关联变量 类型&#xff1a;CTabCtrl 名称&#xff1a;m_tab&#xff09;&#xff0c;添加两个子对话框&#xff08;IDC_PAGE1和IDC_PAGE2&#xff09;&#xff0c;给子对…

【数据结构】树的基础知识及三种存储结构

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

【Python】爬虫基础

爬虫是一种模拟浏览器实现&#xff0c;用以抓取网站信息的程序或者脚本。常见的爬虫有三大类&#xff1a; 通用式爬虫&#xff1a;通用式爬虫用以爬取一整个网页的信息。 聚焦式爬虫&#xff1a;聚焦式爬虫可以在通用式爬虫爬取到的一整个网页的信息基础上只选取一部分所需的…

SEO百度优化基础知识全解析(了解百度SEO标签作用)

百度SEO优化的作用介绍&#xff1a; 百度SEO优化是指通过对网站的内部结构、外部链接、内容质量、用户体验等方面进行优化&#xff0c;提升网站在百度搜索结果中的排名&#xff0c;从而提高网站的曝光率和流量。通过百度SEO优化&#xff0c;可以让更多的潜在用户找到你的网站&…

redis持久化、主从和哨兵架构

一、redis持久化 1、RDB快照&#xff08;snapshot&#xff09; redis配置RDB存储模式&#xff0c;修改redis.conf文件如下配置&#xff1a; # 在300s内有100个或者以上的key被修改就会把redis中的数据持久化到dump.rdb文件中 # save 300 100# 配置数据存放目录&#xff08;现…

数据结构:树的概念和结构

文章目录 1. 树的概念2. 树的结构3. 树的相关概念4. 树的表示孩子表示法双亲表示法孩子兄弟表示法 5. 树在实际中的应用5. 树在实际中的应用 1. 树的概念 树是一种非线性的数据结构,它是由 n (n > 0)个有限结点组成一个具有层次关系的. 把它叫做树是因为它看起来像一棵倒挂的…