当前位置: 首页 > news >正文

【个人学习总结】反悔贪心:反悔堆+反悔自动机

参考:【学习笔记】反悔贪心 - RioTian


什么是反悔贪心?

反悔贪心,就是可以回溯的贪心,一般题目我们能使用正常贪心的情况是很少的,因为我们只考虑了局部最优解,我们不能保证局部最优解是最后的最优解,就像买股票,万一后面又涨了呢,那我肯定就要后悔了(

总之,对于此类问题,我们将使用反悔贪心来解决


反悔堆

对于某些问题我们将采用最大/小堆来当作中介,以下介绍几种模型

一.“消耗单位时间得非单位价值”求最优解问题

P2949 [USACO09OPEN] Work Scheduling G - 洛谷

思路:

每次我们都可以消耗单位时间来得到 P[i] 的利润,当总消耗时间超过 D[i] 那我们便不能够选取了 P[i]了,对于此题,正常贪心肯定不行,那我们就考虑反悔贪心

首先我们将所有工作按结束时间升序排序,然后我们用一个最小堆优先队列来存储所选的 P[i],那么对于第 i 个工作我们可以有以下情况

①.如果当前的时间小于等于 work[i] 的截至时间

对于这种情况,我们肯定是直接选比较好(贪心),同时将 P[i] 存储到队列中,以便后续反悔

(此时记得将时间t++,因为我们是真正选了)

②.如果当前的时间大于 work[i] 的截至时间

那我就看堆顶的 P 是否大于 P[i],如果大于,那我们肯定就要反悔了,毕竟选这个更好,同时再将答案加上二者的差值

(此时时间t就不需要增加了,因为我们是撤销了之前的操作,由于消耗时间都是单位时间,所以相当于没增加也没减少时间)

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include <iomanip>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <utility>
#include <array>
#include <tuple>
using namespace std;
#define ll long long
#define yes cout << "YES" << endl
#define no cout << "NO" << endlpriority_queue<int,vector<int>,greater<>> pq;struct work
{int time, val;
};void solve()
{int n;cin >> n;vector<work> wk(n);for (int i = 0; i < n; i++){cin >> wk[i].time >> wk[i].val;}sort(wk.begin(), wk.end(), [](work a, work b) {return a.time < b.time; });ll ans = 0;for (int i = 0,t=1; i < n; i++){if (t <= wk[i].time){pq.push(wk[i].val);ans += wk[i].val;t++;}else{int x = pq.top();if (x < wk[i].val){pq.pop();pq.push(wk[i].val);ans += wk[i].val - x;}}}cout << ans;
}
int main()
{cin.tie(0)->sync_with_stdio(false);int t = 1;//cin >> t;while (t--){solve();}return 0;
}

P3093 [USACO13DEC] Milk Scheduling S - 洛谷

思路:

其实和上题一摸一样(不知道为什么难度还不一样)

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include <iomanip>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <utility>
#include <array>
#include <tuple>
using namespace std;
#define ll long long
#define yes cout << "YES" << endl
#define no cout << "NO" << endlstruct MyStruct
{int g, d;
};void solve()
{int n;cin >> n;vector<MyStruct> cow(n);for (int i = 0; i < n; i++){cin >> cow[i].g >> cow[i].d;}priority_queue<int,vector<int>,greater<>> pq;sort(cow.begin(), cow.end(), [](MyStruct a, MyStruct b) {return a.d < b.d; });ll ans = 0;for (int i = 0, t = 1; i < n; i++){if (t <= cow[i].d){pq.push(cow[i].g);ans += cow[i].g;t++;//真正选了,所以要加时间}else if (!pq.empty()){//反悔操作,相当于撤销原来操作,不增加时间int x = pq.top();if (x < cow[i].g){pq.pop();pq.push(cow[i].g);ans += cow[i].g - x;}}}cout << ans;
}
int main()
{//cin.tie(0)->sync_with_stdio(false);int t = 1;//cin >> t;while (t--){solve();}return 0;
}

二.“消耗持续时间得单位价值”求最优解问题

P4053 [JSOI2007] 建筑抢修 - 洛谷

思路:

我们可以像第一类模型一样,我们可以也先按截至时间升序排序,同时我们也用一个优先队列来当中介控制反悔,那么显然,此时我们每个选择都只能得到单位价值,所以我们优先队列就要按照最大堆排序了,且是按每个选择得消耗时间降序排序

为什么?很显然,得X单位价值消耗的时间越少越好,这样才能给后续留有更大的选择空间

所以对于此题,我们可以先升序排序所有任务,然后定义一个所消耗的时间sum,接着枚举所有任务,每次都考虑先选,然后再考虑要不要反悔,那么就有以下情况

①.当前总时间小于等于该任务的截至时间

此时我们肯定要选(贪心)

②.当前总时间大于该任务的截至时间

此时我们就直接将堆顶弹出即可,因为堆顶是耗时最多的元素,同时我们是因为加入新元素才超时的,以此肯定是去除耗时最多的元素最好

而且我们这种先选再考虑的方法也方便了我们反悔,因为可能堆顶最大元素可能就是我们刚刚加入的,所以不需要再比较了

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include <iomanip>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <utility>
#include <array>
#include <tuple>
using namespace std;
#define ll long long
#define yes cout << "YES" << endl
#define no cout << "NO" << endlstruct MyStruct
{int t1, t2;
};void solve()
{int n;cin >> n;vector<MyStruct> bulid(n);for (int i = 0; i < n; i++){cin >> bulid[i].t1 >> bulid[i].t2;}sort(bulid.begin(), bulid.end(), [](MyStruct a, MyStruct b) {return a.t2 < b.t2; });ll ans = 0, sum = 0;priority_queue<int> pq;for (int i = 0; i < n; i++){sum += bulid[i].t1;pq.push(bulid[i].t1);if (sum <= bulid[i].t2){ans++;}else{sum -= pq.top();pq.pop();}}cout << ans;
}
int main()
{//cin.tie(0)->sync_with_stdio(false);int t = 1;//cin >> t;while (t--){solve();}return 0;
}

反悔自动机

相比于反悔堆,反悔自动机更加高级一点,它能够自动的维护我们反悔的操作,通常适用于带限制的决策问题上,不过得想出一种策略以便我们代码执行

CF865D Buy Low Sell High - 洛谷

思路:

对于此题,由于我们只能买一股和卖一股,我们可以考虑以下情况

假如我们每一股都买,那我们考虑如何卖出才最好

显然,如果 x < y 那么此时我们卖出肯定是赚钱的,所以遇到大于自生卖出肯定是赚的

那假如有以下情况呢?

如果 x < y < z,此时如果我们卖出的是 x y这一组合,肯定是不如卖出 x z这一组合的

但是我们之前假设每一股都买了,也就是说我们会这样卖出 y - x + z - y,其实就是z - x

我们注意到y其实是无所谓的,那我们就可以设计一个策略来实现反悔自动机

首先我们先买入股票(这个用作贪心),然后我们判断优先队列中是否有比当前股票大的,

如果有的话,那我们就卖了,同时买入当天的(便于后续反悔)

这样的话每次遇到更好的,我们都能用中间值换取更多的钱

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include <iomanip>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <utility>
#include <array>
#include <tuple>
using namespace std;
#define ll long long
#define yes cout << "YES" << endl
#define no cout << "NO" << endlvoid solve()
{int n;cin >> n;priority_queue<int,vector<int>,greater<>> pq;ll ans = 0;for (int i = 0; i < n; i++){int x;cin >> x;if (!pq.empty()){int t = pq.top();if (x > t){ans += x - t;pq.pop();pq.push(x);}}pq.push(x);}cout << ans;
}
int main()
{//cin.tie(0)->sync_with_stdio(false);int t = 1;//cin >> t;while (t--){solve();}return 0;
}

THE END

相关文章:

【个人学习总结】反悔贪心:反悔堆+反悔自动机

参考&#xff1a;【学习笔记】反悔贪心 - RioTian 什么是反悔贪心&#xff1f; 反悔贪心&#xff0c;就是可以回溯的贪心&#xff0c;一般题目我们能使用正常贪心的情况是很少的&#xff0c;因为我们只考虑了局部最优解&#xff0c;我们不能保证局部最优解是最后的最优解&…...

通往 AI 之路:Python 机器学习入门-线性代数

2.1 线性代数&#xff08;机器学习的核心&#xff09; 线性代数是机器学习的基础之一&#xff0c;许多核心算法都依赖矩阵运算。本章将介绍线性代数中的基本概念&#xff0c;包括标量、向量、矩阵、矩阵运算、特征值与特征向量&#xff0c;以及奇异值分解&#xff08;SVD&…...

迷你世界脚本UI五子棋小游戏

wzq_jm "7477124677881080183-22855"--界面id wzq_jmjxh "7477124677881080183-22855_"--界面加下划线 wzq_tc "7477124677881080183-22855_262"--退出按钮id wzq_hdlt1 "7477124677881080183-22855_267"--互动聊天按钮 快点吧&a…...

阿里万相,正式开源

大家好&#xff0c;我是小悟。 阿里万相正式开源啦。这就像是AI界突然开启了一扇通往宝藏的大门&#xff0c;而且还是免费向所有人敞开的那种。 你想想看&#xff0c;在这个科技飞速发展的时代&#xff0c;AI就像是拥有神奇魔法的魔法师&#xff0c;不断地给我们带来各种意想…...

C# 数据转换

1. 文本框读取byte&#xff0c;ushort格式数据 byte addr; if (byte.TryParse(textBoxAddr.Text, out addr) true) {}2. 字节数组 (byte[]) 转换为 ASCII 字符串 byte[] bytes { 72, 101, 108, 108, 111 }; // "Hello" 的 ASCII 码 string s0 Encoding.ASCII.Ge…...

学习第十一天-树

一、树的基础概念 1. 定义 树是一种非线性数据结构&#xff0c;由 n 个有限节点组成层次关系集合。特点&#xff1a; 有且仅有一个根节点其余节点分为若干互不相交的子树节点间通过父子关系连接 2. 关键术语 术语定义节点包含数据和子节点引用的单元根节点树的起始节点&#…...

网络服务之SSH协议

一.SSH基础 1.1 什么是ssh SSH&#xff08;Secure Shell&#xff09;协议是一种用于字符界面远程登录和数据加密传输的协议。 1.2 ssh优点 优点&#xff1a; 数据传输是加密的&#xff0c;可以防止信息泄漏 数据传输是压缩的&#xff0c;可以提高传输速度 注意&#xff…...

蓝桥杯 之 前缀和与查分

文章目录 题目求和棋盘挖矿 前缀和有利于快速求解 区间的和、异或值 、乘积等情况差分是前缀和的反操作 前缀和 一维前缀和&#xff1a; # 原始的数组num,下标从1到n n len(num) pre [0]*(n1) for i in range(n):pre[i1] pre[i] num[i] # 如果需要求解num[l] 到num[r] 的区…...

GB28181开发--ZLMediaKit‌+WVP+Jessibuca‌

一、核心组件功能 1‌、ZLMediaKit‌ 定位‌:基于 C++11 的高性能流媒体服务框架,支持 RTSP/RTMP/HLS/HTTP-FLV 等协议互转,具备低延迟(最低 100ms)、高并发(单机 10W 级连接)特性,适用于商用级流媒体服务器部署‌。 ‌特性‌:跨平台(Linux/Windows/ARM 等)、支持 …...

Ubuntu20.04 在离线机器上安装 NVIDIA Container Toolkit

步骤 1.下载4个安装包 Index of /nvidia-docker/libnvidia-container/stable/ nvidia-container-toolkit-base_1.13.5-1_amd64.deb libnvidia-container1_1.13.5-1_amd64.deb libnvidia-container-tools_1.13.5-1_amd64.deb nvidia-container-toolkit_1.13.5-1_amd64.deb 步…...

如何快速上手RabbitMQ 笔记250304

如何快速上手RabbitMQ 要快速上手 RabbitMQ&#xff0c;可以按照以下步骤进行&#xff0c;从安装到基本使用逐步掌握核心概念和操作&#xff1a; 1. 理解核心概念 Producer&#xff08;生产者&#xff09;&#xff1a;发送消息的程序。Consumer&#xff08;消费者&#xff09…...

无人机端部署 AI 模型,实现实时数据处理和决策

在无人机端部署 AI 模型&#xff0c;实现实时数据处理和决策&#xff0c;是提升无人机智能化水平的关键技术之一。通过将 AI 模型部署到无人机上&#xff0c;可以实现实时目标检测、路径规划、避障等功能。以下是实现这一目标的详细方案和代码示例。 一、实现方案 1. 硬件选择…...

CentOS 7中安装Dify

Dify 是一个开源的 LLM 应用开发平台。其直观的界面结合了 AI 工作流、RAG 管道、Agent、模型管理、可观测性功能等&#xff0c;让您可以快速从原型到生产。尤其是我们本地部署DeepSeek等大模型时&#xff0c;会需要用到Dify来帮我们快捷的开发和应用。 大家可以参考学习它的中…...

CoDrivingLLM

CoDrivingLLM 思路 1.输入和输出 输入 算法的输入包括车辆当前时刻的状态 S t S_t St​ &#xff0c;这个状态包含了车辆的位置、速度、行驶方向等信息&#xff1b;以及参与协同驾驶的联网自动驾驶汽车列表C&#xff0c;用于确定需要进行决策的车辆集合。 输出 输出为车辆…...

Centos7升级openssl和openssh最新版

1、事前准备 下载openssl3.4.1和openssh9.9p2压缩包上传到服务器 https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable// Release OpenSSL 3.4.1 openssl/openssl GitHub 2、查看centos7、ssh以及openssl的版本信息 # 查看CentOS系统版本信息 cat /etc/redhat-release …...

相控阵扫盲

下图展示天线增益 在仰角为0度的情况下随着方位角的变化而变化。需要注意到的是在天线视轴方向上的高增益主瓣上还有几个低增益旁瓣 阵列因子乘以新的阵元方向图会形成指向性更强的波速...

nginx 配置 301跳转

HTTP 跳转到 HTTPS 将所有 HTTP 请求&#xff08;80 端口&#xff09;跳转到 HTTPS&#xff08;443 端口&#xff09;&#xff1a; server {listen 80;server_name example.com;# 跳转到 HTTPSreturn 301 https://$host$request_uri; }server {listen 443 ssl;server_name exa…...

开发环境搭建-03.后端环境搭建-使用Git进行版本控制

一.Git进行版本控制 我们对项目开发就会产生很多代码&#xff0c;我们需要有效的将这些代码管理起来&#xff0c;因此我们真正开发代码前需要把我们的Git环境搭建好。通过Git来管理我们项目的版本&#xff0c;进而实现版本控制。 首先我们使用Git创建本地仓库&#xff0c;然后…...

vivado 充分利用 IP 核

充分利用 IP 核 使用预先验证的 IP 核能够大幅减少设计和验证工作量&#xff0c;从而加速产品上市进程。如需了解更多有利用 IP 的信息&#xff0c;请参 阅以下资源&#xff1a; • 《 Vivado Design Suite 用户指南&#xff1a;采用 IP 进行设计》 (UG896) [ 参照 1…...

外盘农产品期货数据:历史高频分钟回测的分享下载20250305

外盘农产品期货数据&#xff1a;历史高频分钟回测的分享下载20250305 在国际期货市场中&#xff0c;历史分钟高频数据的作用不可小觑。这些数据以分钟为时间尺度&#xff0c;详细记录了期货合约的价格变动和交易量信息&#xff0c;为投资者提供了全面、深入的市场分析视角。通…...

计算机毕设-基于springboot的网上商城系统的设计与实现(附源码+lw+ppt+开题报告)

博主介绍&#xff1a;✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围&#xff1a;Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…...

用DeepSeek-R1-Distill-data-110k蒸馏中文数据集 微调Qwen2.5-7B-Instruct!

下载模型与数据 模型下载&#xff1a; huggingface&#xff1a; Qwen/Qwen2.5-7B-Instruct HF MirrorWe’re on a journey to advance and democratize artificial intelligence through open source and open science.https://hf-mirror.com/Qwen/Qwen2.5-7B-Instruct 魔搭&a…...

【C++设计模式】第四篇:建造者模式(Builder)

注意&#xff1a;复现代码时&#xff0c;确保 VS2022 使用 C17/20 标准以支持现代特性。 分步骤构造复杂对象&#xff0c;实现灵活装配 1. 模式定义与用途 核心目标&#xff1a;将复杂对象的构建过程分离&#xff0c;使得同样的构建步骤可以创建不同的表示形式。 常见场景&am…...

【杂谈】信创电脑华为w515(统信系统)登录锁定及忘记密码处理

华为w515麒麟芯片版&#xff0c;还有非麒麟芯片版本&#xff0c;是一款信创电脑&#xff0c;一般安装的UOS系统。 准备一个空U盘&#xff0c;先下载镜像文件及启动盘制作工具&#xff0c;连接如下&#xff1a; 百度网盘 请输入提取码 http://livecd.uostools.com/img/apps/l…...

VBA信息获取与处理第五节:如何在单个工作表中查找某个给定值

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。这部教程给大家讲解的内容有&#xff1a;跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…...

版本控制器Git和gdb

一.版本控制器Git 1.版本控制简单来讲可以对每一份代码版本进行复制保存&#xff0c;保证每一版代码都可查 2.仓库的本质也是一个文件夹 3.git既是一个客户端&#xff0c;也是一个服务器&#xff0c;是一个版本控制器。而gitee和GitHub都是基于git的网站或平台 4.git的基本…...

关于tresos Studio(EB)的MCAL配置之GPT

概念 GPT&#xff0c;全称General Purpose Timer&#xff0c;就是个通用定时器&#xff0c;取的名字奇怪了点。定时器是一定要的&#xff0c;要么提供给BSW去使用&#xff0c;要么提供给OS去使用。 配置 General GptDeinitApi控制接口Gpt_DeInit是否启用 GptEnableDisable…...

大学至今的反思与总结

现在是2025年的3月5日&#xff0c;我大三下学期。 自大学伊始&#xff0c;我便以考研作为自己的目标&#xff0c;有时还会做自己考研上岸头部985,211&#xff0c;offer如潮水般涌来的美梦。 但是我却忽略了一点&#xff0c;即便我早早下定了决心去考研&#xff0c;但并没有早…...

我们来学nginx -- 优化下游响应速度

优化下游响应速度 题记启用 Gzip 压缩优化缓冲区设置设置超时时间 题记 专家给出的配置文件真是…&#xff0c;信息量有点大啊&#xff01; nginx&#xff1a;我只想作为一个简单的代理专家爸爸&#xff1a;都是为了你好&#xff01; 这样&#xff0c;先从有关响应速度的角度&…...

国内外优秀AI外呼产品推荐

在数字化转型浪潮中&#xff0c;AI外呼系统凭借其高效率、低成本、精准交互的特点&#xff0c;成为企业客户触达与服务的核心工具。本文基于行业实践与技术测评&#xff0c;推荐国内外表现突出的AI外呼产品&#xff0c;重点解析国内标杆企业云蝠智能&#xff0c;并对比其他代表…...