【算法】反悔贪心

文章目录

  • 反悔贪心
  • 力扣题目列表
    • 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.rhkb.cn/news/129771.html

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

相关文章

【SpringMVC】实现增删改查(附源码)

目录 引言 一、前期准备 1.1.搭建Maven环境 1.2.导入pom.xml依赖 1.3.导入配置文件 ①jdbc.properties ②generatorConfig.xml ③log4j2.xml ④spring-mybatis.xml ⑤spring-context.xml ⑥spring-mvc.xml ⑦修改web.xml文件 二、逆向生成增删改查 2.1.导入相关u…

Window安装Node.js npm appium Appium Desktop

Window安装Node.js npm appium appium Desktop 1.安装nodejs 参考链接&#xff1a; https://blog.csdn.net/weixin_42064877/article/details/131610918 1)打开浏览器&#xff0c;并前往 Node.js 官网 https://nodejs.org/ ↗。 2)在首页中&#xff0c;您可以看到当前 Node.…

JS中 bind()的用法,call(),apply(),bind()异同点及使用,如何手写一个bind()

✨什么是bind() bind()的MDN地址 bind() 方法创建一个新函数&#xff0c;当调用该新函数时&#xff0c;它会调用原始函数并将其 this 关键字设置为给定的值&#xff0c;同时&#xff0c;还可以传入一系列指定的参数&#xff0c;这些参数会插入到调用新函数时传入的参数的前面。…

ElasticSearch第二讲:ES详解 - ElasticSearch基础概念

ElasticSearch第二讲&#xff1a;ES详解 - ElasticSearch基础概念 在学习ElasticSearch之前&#xff0c;先简单了解下ES流行度&#xff0c;使用背景&#xff0c;以及相关概念等。本文是ElasticSearch第二讲&#xff0c;ElasticSearch的基础概念。 文章目录 ElasticSearch第二讲…

G. The Morning Star

Problem - G - Codeforces 思路&#xff1a;想了挺长时间的&#xff0c;一直没想到一个简便的方法在瞎搞。我们发现对于某个点来说&#xff0c;其他的点如果能够跟他匹配&#xff0c;那么一定在这8个方向上&#xff0c;而同时这8个方向其实对应这4条直线&#xff0c;假设点为(x…

云服务器与内网穿透有什么区别?哪个好用?

云服务器与内网穿透有什么区别&#xff0c;哪个好用&#xff1f;如何在自己公网IP云主机上部署搭建P2P穿透&#xff1f;这里给大家汇总介绍一下&#xff0c;供大家共同学习了解。 云服务器的一些特点&#xff1a; 需要数据上云场景时&#xff0c;通常可以选择使用云服务器。 …

Yarn资源调度器

文章目录 一、Yarn资源调度器1、架构2、Yarn工作机制3、HDFS、YARN、MR关系4、作业提交之HDFS&MapReduce 二、Yarn调度器和调度算法1、先进先出调度器&#xff08;FIFO&#xff09;2、容量调度器&#xff08;Capacity Scheduler&#xff09;3、公平调度器&#xff08;Fair …

[Rust GUI]0.10.0版本iced代码示例 - progress_bar

-1 字体支持 iced0.10.0 仅支持指定系统内置字体(iced默认字体中文会乱码) iced0.10.0 手动加载字体的功能已经砍了&#xff0c;想手动加载就用0.9.0版本&#xff0c;文档0.9.0版本 想显示中文则需要运行在一个自带字体的Windows系统上。而且这个字体最好不要钱。 (Windows闲着…

PyCharm集成开发环境安装、启动与设置

作为非开发工程师职业,大家多多少少都会对编程有抵触,其实没有必要对Python有太大的“戒心" ,把Python当做你的一个工具就可以了。——扎克伯格 一、Python的定义&#xff1a; Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python的设计具有…

Edge官方鼠标手势

前言 日期&#xff1a;2023年8月 Edge浏览器目前已自带官方的鼠标手势功能&#xff0c;若要使用首先将浏览器更新至最新版&#xff0c;下文介绍使用方法。 官方鼠标手势 前提 更新Edge至最新版&#xff0c;并关闭其它鼠标手势扩展。 开启鼠标手势 打开Edge浏览器的设置&…

技术分析需谨慎,各位投资者应该这样做

技术市场分析中存在许多工具&#xff0c;其中之一便是烛台模式。然而对于这些模式和指标&#xff0c;FPmarkets澳福和各位投资者应持谨慎的态度&#xff0c;因为它们仅仅展示了一种可能的结果&#xff0c;而无法确保其绝对准确。 关于蜡烛图交易的提示&#xff0c;包括Maruboz…

反转字符串 反转字符串 || 反转字符串 |||

思想总结&#xff1a;首先将字符串转变为字符数组&#xff0c;再进行遍历并反转字符。 1.反转字符串 代码&#xff1a; class Solution {public void reverseString(char[] s) {reverse(s,0,s.length); //左闭右开}public static void reverse(char[] ch,int i,int j) { 翻转函…

springboot之二:整合junit进行单元测试+整合redis(本机、远程)+整合mybatis

资源地址&#xff1a; 整合junit的代码&#xff1a;https://download.csdn.net/download/zhiaidaidai/88291527 整合redis的代码&#xff1a;https://download.csdn.net/download/zhiaidaidai/88291536 整合mybatis的代码&#xff1a;https://download.csdn.net/download/zh…

DGA行为转变引发了对网络安全的担忧

Akamai的研究人员发现&#xff0c;在域名系统(DNS)流量数据中&#xff0c;动态种子域生成算法(DGA)家族的行为发生了令人担忧的变化。这一发现揭示了恶意行为者如何调整他们的策略来延长他们的指挥与控制(C2)通信通道的寿命&#xff0c;以保护他们的僵尸网络。 从技术角度来看…

云数据库知识学习——云数据库产品、云数据库系统架构

一、云数据库产品 1.1、云数据库厂商概述 云数据库供应商主要分为三类。 ① 传统的数据库厂商&#xff0c;如 Teradata、Oracle、IBM DB2 和 Microsoft SQL Server 等。 ② 涉足数据库市场的云供应商&#xff0c;如 Amazon、Google、Yahoo!、阿里、百度、腾讯…

【Linux】编辑器 vim

1、vim的基本概念 vi/vim【一款文本编辑器】vim【一款多模式编辑器】vi/vim 的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是 vim 是 vi 的升级版本&#xff0c;它不仅兼容vi的所有指令&#xff0c;而且还有一些新的特性在里面。例如语法加亮&#xff0…

linux 网络接口的子接口的配置

参考&#xff1a; https://blog.csdn.net/baidu_38803985/article/details/104653205 在 Linux 中&#xff0c;网络接口通常以ethX的形式命名&#xff0c;其中X代表接口的编号&#xff0c;例如eth0代表第一个网络接口&#xff0c;eth1代表第二个&#xff0c;依此类推。虚拟子接…

【PyQT5教程】-02-UI组件

1.按钮 QtWidgets模块提供了多种按钮类&#xff0c;让你可以轻松地创建各种类型的按钮 1.1 QPushButton&#xff08;普通按钮&#xff09; QPushButton是PyQt5中最常见的按钮类型之一&#xff0c;用于触发动作或执行操作。通过信号与槽机制&#xff0c;你可以将按钮的点击事…

day37 线程

一、线程安全 二、多线程并发的安全问题 当多个线程并发操作同一临界资源 由于线程切换实际不确定 导致操作顺序出现混乱 产生的程序bug 严重时出现系统瘫痪 临界资源 &#xff1a;操作该资源的完整流程同一时间只能被单一线程操作的资源 多线程并发会出现的各种问题、 如…

Serverless Framework 亚马逊云(AWS)中国地区部署指南

Serverless Framework 亚马逊云(AWS)中国地区部署指南 Serverless Framework 亚马逊云(AWS)中国地区部署指南 前言前置准备 1. 账号的注册2. 全局安装 serverless3. 设置你的系统环境变量4. 设置部署凭证 快速部署一个 hello world 创建入口函数 index.js event 参数context 参…