贪心tricks总结

news/2025/2/11 17:10:26/文章来源:https://www.cnblogs.com/vanueber/p/18710140

贪心题一般没有什么技巧,多做题积累经验。

对于结论或策略,大胆猜想,小心求证,注意使用数据结构优化/结合其他算法。

一般类贪心

主要是证明贪心的正确性。

H. Fight Against Monsters

先用二分求出每个怪需要打的次数。

问题转化为
1

一个排列的答案是

\[\sum_{i=1}^{n} \sum_{i\le j}^{n} a_j \]

考虑邻项交换 \(i,i+1\),答案的变化就为

\[b_i \sum_{j \ge i}^{n}a_j + b_{i+1} \sum_{j \ge i}^{n} a_j - (b_{i+1}\sum_{j \ge i}^{n}a_j + b_{i}\sum_{j \ge i}^{n} a_j) = b_{i+1}a_i - b_i a_{i+1} \]

如果交换更优,应满足

\[b_{i+1}a_i < b_i a_{i+1} \]

\[\frac{b_i}{a_i} > \frac{b_{i+1}}{a_{i+1}} \]

按照属性升序排序即可。

打怪兽2

对于 \(b_i \ge a_i\) 的肯定先打,按照 \(a_i\) 排序。

对于 \(b_i < a_i\) 的,考虑邻项交换。

设现在还剩血量 \(t\),面对怪兽 \((a_i,b_i),(a_{i+1},b_{i+1})\),若不交换更优,应满足

\[t-a_i \ge 0\\ t-a_i+b_i-a_{i+1} \ge 0\\ t-a_{i+1} < 0 \ \lor \ t-a_{i+1}+b_{i+1}-a_{i} < 0 \]

\(b_i<a_i\)

\[t-a_{i+1} > 0 \]

只能有

\[t-a_{i+1}+b_{i+1}-a_i<0 \]

进一步

\[a_i+a_{i+1}-b_i \le t < a_{i+1} + a_i -b_{i+1} \]

\[b_i > b_{i+1} \]

按照 \(b\) 降序排序即可。

反悔贪心

P2949 [USACO09OPEN] Work Scheduling G

题目大意:给个任务有一个截止时间,每个时间安排一个任务,求最大利润。

朴素贪心想法:按照截止时间排序,优先做利润大的。

问题在于如果后面出现了利润更大的,但前面的已经被安排满了,就会导致贪心策略错误,故这种情况就要反悔操作。

使用一个优先队列维护一个做过的决策集合,如果当前任务还能做,直接加入集合。否则,从之前的决策中取利润最小的替换掉。

这个操作等价于没有做之前的利润小的任务,直接做了利润更大的任务,从局部最优满足了全局最优。

sort(a+1,a+1+n);
for(int i=1;i<=n;++i)
{if(a[i].d<=Q.size()){if(Q.top()>a[i].p) continue;else{int x=Q.top();Q.pop();ans+=a[i].p-x;Q.push(a[i].p);}}else{ans+=a[i].p;Q.push(a[i].p);}
}

P4053 [JSOI2007] 建筑抢修

题目大意:每个任务有所需时间和截止时间,求最多能安排多少任务。

朴素贪心:按照截止时间排序,扫一遍判断是否能做。

此时就会有无法做的任务,我们会直接舍弃,给前面一个任务很多的时间,贪心错误,考虑反悔。

用一个大根堆维护决策集合,具体维护其时间。如果当前时间能够做这个任务,就直接做。否则,一定有一个任务是不能做的,只能尽可能地压缩当前时间,以保证后面能安排更多的任务。于是考虑从大根堆中取出耗费时间最多的决策去除,消去其贡献。

注意一定要先贪心再反悔。


贪心证明:

假设我们确定了要选 \(S\) 中的所有任务,通过邻项交换推导策略。

记之前已经用的时间为 \(t\),即 \(\sum_{k=1}^{i-1} a_k = t\)

对于相邻的 \(i,j\),交换前更优,即满足交换后就没法完成第二个任务了,有

\[t+a_i \le d_i,t+a_i+a_j \le d_j \]

交换后有

\[t+a_j \le d_j,t+a_j+a_i > d_i \]

整理一下,有

\[d_i<d_j \]

故是按照截止时间排序。


int now=0,cnt=0;
for(int i=1;i<=n;++i)
{now+=a[i].t1;Q.push(a[i].t1);if(now<=a[i].t2){++cnt;}else{int x=Q.top();Q.pop();now-=x;}
}

然后就可以通过转化,将这个问题建模为其他问题:

Zabuton

将每个人抽象成任务,拥有任务所需时间和截止时间,那么添加的砖就是任务所需时间,最初的砖不能超过 \(H\),等价于最后的砖不能超过 \(H+P\),可以转化为截止时间。

for(int i=1,p,h;i<=n;++i)
{h=read(),p=read();a[i].t1=p,a[i].t2=p+h;
}

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

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

相关文章

dp优化之斜率优化小结

这或许是这几天的济南云斗集训之旅最大的收获吧,若是最后一天的模拟赛文件不会交错也许结局会更好,但在这残酷的现实中却从不会有“如果”一词,母亲以不想让我学了,或许考完今年的 CSP 就可能不学了吧。 本文将效仿《李煜东算法进阶指南》的思路,按照例题层层深入。 P2365…

P3406 海底高铁(差分)

这道题要用到差分,因为反复经过一条路时只需要买一张对应的卡就行了,不用买多张,所以我们可以用差分,算出经过每条路的次数,要注意假设从1到3城市,只经过了道路1和道路2,应该让cha【1】++,cha【3】--; 还有算结果时应该从1到n-1列举每一条路,我最开始就搞错了,还要注…

JPlag:开源的代码抄袭检测工具

一、基本信息•项目地址: https://gitcode.com/gh_mirrors/jp/JPlaghttps://github.com/jplag/JPlag•编程语言:基于Java开发•主要特性:跨平台运行、支持多种文件格式、提供图形用户界面(GUI)和命令行接口、可扩展性强 二、技术特点 •多语言支持:JPlag支持包括Java、C、…

重构谷粒商城01:为何重构谷粒商城

前言:这个系列将使用最前沿的cursor作为辅助编程工具,来快速开发一些基础的编程项目。目的是为了在真实项目中,帮助初级程序员快速进阶,以最快的速度,效率,快速进阶到中高阶程序员。 本项目将基于谷粒商城项目,并且对谷粒商城项目进行二次重构,使其满足最新的主流技术栈…

div设置四个角边框

示例实现 .top-header {background-image:url(../../assets/slider/topHeaderTopLeft.svg), /* 左上角图像 */url(../../assets/slider/topHeaderTopRight.svg), /* 右上角图像 */url(../../assets/slider/topHeaderBottomLeft.svg), /* 左下角图像 */url(../../assets/slider/…

JavaScript根据访问链接不同的后缀参数,展示不同的页面

要求:根据访问者访问不同的后缀链接,展示不同的页面;$(document).ready(function () {// 获取 URL 参数const urlParams = new URLSearchParams(window.location.search);const page = urlParams.get(page) || model; // 默认显示第一个导航项(比分)的内容和图标$(.tab-co…

内外网文件传输方案

文件传输问题:企业内网和外网分开了,如何进行文件快速有效稳定的传输呢?如何 进行文件交换、在线审批、在线审计呢?如何保证安全可控的文件传输、性能及扩展性强、审批审计便捷呢?常见痛点有哪些?纸质申请、线下审批、传递效率很慢,传递成本高, 纸质单据与电子文件脱节…

H3C--堆叠(IRF)

拓扑图 配置流程 配置SW1与SW2堆叠 一、SW1:shutdown 物理端口 配置堆叠优先级,优先级高的成为主设备 创建堆叠逻辑接口,将物理接口加入到堆叠逻辑接口中二、SW1: sysname SW1#irf member 1 priority 6#irf-port 1/1 port group interface FortyGigE1/0/53 port group int…

JavaScript判断iPhone型号机型及iPhone版本Identifier对照

要求:根据用户安装App后,返回的设备型号,判断iPhone版本 实现代码:function getModelValue(last_model) {// 如果last_model不包含"iPhone",则直接返回原值if (!last_model.includes(iPhone)) {return last_model;}// 定义子字符串和对应值的全面映射const mode…

linux部署nacos集群

本次部署 3个nacos节点,然后一个负载均衡器(nginx)代理3个Nacos。集群部署按照前述,做好数据库脚本的初始化、防火墙策略的设置。安装jdk 解压jdk文件 cd /data/soft tar -zxvf jdk-23_linux-x64_bin.tar.gz修改环境变量 vi /etc/profile#install JAVA JDK export JAVA_HOM…

本地部署 Browser-Use WebUI + 本地部署 DeepSeek 实现浏览器AI自动化

前一版采用的是 Deepseek 官方API,由于最近比较火,可能遇到服务器繁忙导致运行不成功,这一版选择通过 Ollama 本地部署的模型 一、安装部署(已安装 python3.11 或以上版本、playwright) 1.下载最新源码包(v1.4及以上版本),解压 https://github.com/browser-use/web-ui/…

QComboBox样式设置

参考 https://blog.csdn.net/xiaopei_yan/article/details/107404698相关qss代码QComboBox{border:1px solid rgb(174,174,174);border-radius: 0;padding-left: 15px;font-size:10pt; } QComboBox::drop-down {subcontrol-origin: padding;subcontrol-position: top right;w…