【反悔贪心】算法讲解

目录

cf865D

 环形喂猪

建筑抢修


        

        

cf865D

思路:

我们贪心的原则是尽可能的多卖,而且尽可能的卖的多。

整体的贪心思路就是能卖就卖,卖完后放入堆中(以便反悔),先不考虑能卖多少,因为堆是按照价格从小到大排序,把最优的选择放在最前面。

在遍历到第i天时候,如果我们当前卖是可以获利的,那就直接卖掉,然后把价格放入反悔堆。

如果后面还有更大的pk,那么我们可以在pi处撤销丢弃操作(也就是把pi买下来),然后在pk处丢弃。操作就是再加上pk-pi即可。

贪心就是:能卖,我们就卖,不过卖完后要把此点加入堆中,以便我们可以反悔。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
ll ans;
priority_queue<int,vector<int>,greater<int> >heap;//小根堆
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		int p;cin>>p;
		if(heap.size()&&heap.top()<p){
			ans+=p-heap.top();
			heap.pop();
			heap.push(p);
		}
		heap.push(p);
	}
	cout<<ans;
}

        

        

 环形喂猪

思路:

 一道非常典型的反悔贪心,反悔贪心就是我们需要建立一个贪心堆,先按照正常的思路(局部最优)进行贪心,如果当前取出的不是最优解,那就反悔。

我们把所有的猪放入堆中,取出一个最大猪,然后标记左右节点,并把这三个节点删掉,但是又要考虑到方便反悔,而反悔操作应该是a[i-1]+a[i+1],而我们现在已经取了a[i],所以应该把a[i-1]+a[i+1]-a[i]直接加入堆中,并创建新的节点。以方便反悔。

#include <bits/stdc++.h>
using namespace std;
const int N=4e+5;
bool mark[N];
int n,m,l[N],r[N],ans,a[N],tot;
struct node{
	int id,v;
};
priority_queue<node>q;
bool operator<(const node &x,const node &y){
	return x.v<y.v;
}
int main(){
	cin>>n>>m;
	if(m>n/2){
		cout<<"Error!";return 0;
	}
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=2;i<n;i++){
		l[i]=i-1,r[i]=i+1; //创建环形链表
		q.push({i,a[i]});//加入大根堆
	}
	l[1]=n;r[1]=2;l[n]=n-1;r[n]=1;//起点和尾点
	q.push({1,a[1]});q.push({n,a[n]});
	tot=n;
	for(int i=1;i<=m;i++){
		node cur;cur=q.top();q.pop();
		if(mark[cur.id]){i--;continue;}//已经被删掉的点就跳过,注意i--,别又浪费了一袋
		ans+=cur.v;//更新答案
		a[++tot]=a[l[cur.id]]+a[r[cur.id]]-a[cur.id];//创建反悔点
		q.push({tot,a[tot]});//反悔点入堆
		l[tot]=l[l[cur.id]];r[tot]=r[r[cur.id]];//更新新节点的左右关系
		r[l[l[cur.id]]]=tot;l[r[r[cur.id]]]=tot;//新节点的左右节点的指向新节点
		mark[cur.id]=mark[l[cur.id]]=mark[r[cur.id]]=1;//删掉3个点
	}
	cout<<ans;
	return 0;
}

        

        

建筑抢修

思路:

我们贪心的原则是先去修那些代价比较小且很容易报废的建筑(t2比较大的建筑),

如何去修容易报废的建筑呢?那就是按照t2从大到小进行排序进去“抢修”。

所以最开始,我们先按照能修就修的原则去修每一个建筑,然后把修的建筑放入堆中(以便反悔),堆是按照代价排序,以便把最坏的决定放到堆头。

如果当前的建筑可以抢修,那么就直接修,修后放入反悔堆。

如果当前的建筑来不及抢修,我们就去“反思自己”,看看已经修的建筑中有没有代价比这个建筑大的,如果有,那么就反悔time-=heap.top().t1; time+=a[i].t1;之前的出去,新的进来。如果没有,那就直接不用反悔。

#include <bits/stdc++.h> //p4053建筑抢修
using namespace std;
const int N=150005;
int n;
struct node{
	long long t1,t2;
}a[N];
bool operator<(const node &p,const node &q){
	return p.t1<q.t1;
}
bool cmp (const node p,const node q){
	return p.t2<q.t2;
}
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		long long t1,t2;cin>>t1>>t2;
		a[i]=(node){t1,t2};
	}
	sort(a,a+n,cmp);
	priority_queue<node>heap;//大根堆
	long long time=0;//time里面是已经建好所耗费的时间,建的东西在堆中
	for(int i=0;i<n;i++){
		if(a[i].t2>=time+a[i].t1){//正常贪心(能建就去建)
			time+=a[i].t1;
		    heap.push(a[i]);	
		}
		else{
			if(a[i].t1<heap.top().t1){//(反悔贪心)我们之间建了一个很耗时间的房子,现在应该把它替换掉
				time-=heap.top().t1;
				heap.pop();
				time+=a[i].t1;
				heap.push(a[i]);
			}
	}
	}
	cout<<heap.size();
}

        

        

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

02--nginx代理缓存

前言&#xff1a;比较常用的用法反向代理&#xff0c;和缓存的一些操作&#xff0c;用虚拟环境复刻出来&#xff0c;里面参数不用详细记录&#xff0c;用作复习&#xff0c;使用时直接查找即可。环境搭建过程参考前一篇文章nginx基础。 1、基础环境 IP角色作用192.168.189.143…

AWR设置工程仿真频率、原理图仿真频率、默认单位

AWR设置工程仿真频率、原理图仿真频率、默认单位 生活不易&#xff0c;喵喵叹气。马上就要上班了&#xff0c;公司的ADS的版权紧缺&#xff0c;主要用的软件都是NI 的AWR&#xff0c;只能趁着现在没事做先学习一下子了&#xff0c;希望不要裁我。 最近稍微学习了一下AWR这个软…

参加质量源于设计QbD培训能学到什么

近年来&#xff0c;产品质量已经成为了企业能否立足市场的关键。因此&#xff0c;质量源于设计&#xff08;QbD&#xff09;的理念应运而生&#xff0c;它强调在产品开发初期就注重质量设计&#xff0c;以最大限度地降低潜在风险&#xff0c;提高产品的稳定性和可靠性。参加质量…

诺亚财富——财富管理行业的进化逻辑

詹姆斯•卡斯的著作《有限与无限的游戏》中&#xff0c;传递出这样一种观点&#xff1a; “有限的游戏&#xff0c;其目的在于赢得胜利&#xff1b;无限的游戏&#xff0c;却旨在让游戏永远进行下去。有限的游戏在边界内玩&#xff0c;无限的游戏玩的就是边界。” 在商业社会…

我的app开始养活我了

大家在日常使用各类 app 时应该会发现&#xff0c;进入 app 会有个开屏广告&#xff0c;在使用 app 中&#xff0c;时不时的也会有广告被我们刷到。 这时候如果我们看完了这个广告&#xff0c;或者点击了这个广告的话&#xff0c;app商家就会获得这个广告的佣金。 这个佣金就是…

用WebStorm和VS Code断点调试Vue

大家好&#xff0c;我是咕噜铁蛋&#xff01;。今天&#xff0c;我想和大家分享一下如何在WebStorm和VS Code这两款流行的开发工具中&#xff0c;使用断点调试Vue.js项目。Vue.js作为前端三大框架之一&#xff0c;以其轻量级和组件化的特性&#xff0c;受到了广大开发者的喜爱。…

18、matlab信号生成与预处理--剔除异常值:hampel()函数

1、语法 说明&#xff1a;对输入向量x应用Hampel滤波器来检测和去除异常值。 1&#xff09;y hampel(x) 参数&#xff1a;x&#xff1a;输入信号 y:预处理的输出信号 对于x的每个样本&#xff0c;函数计算由样本及其周围的六个样本组成的窗口的中位数&#xff0c;每边三…

Linux下的Git应用及配置

1、卸载 2、安装 3、创建并初始化 4、配置 &#xff08;附加删除语句&#xff09; 5、查看&#xff08;tree .git/&#xff09; 6、增加和提交 7、打印日志 8、验证已操作工作

LeetCode刷题:反转链表

leetCode真题 206. 反转链表 属于基础简单题目 常见的做法有递归和while循环 递归 // 1. 递归参数和返回值public static ListNode reverseList(ListNode head) {// 1. 递归终止条件if (head null || head.next null) {return head;}// 递归逻辑ListNode last reverseL…

安全攻防知识——CTF之MISC

前言&#xff1a; 本周技术分享将介绍安全攻防知识中的MISC部分。MISC&#xff0c;中文即杂项&#xff0c;包括隐写、数据还原、脑洞、社会工程、压缩包解密、流量分析取证、与信息安全相关的大数据等。让我们一起来了解更多吧&#xff01; 一&#xff09;文件结构简介 1.常见…

手把手制作Vue3+Flask全栈项目 全栈开发之路实战篇 问卷网站(一)login页面

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 第五篇 : 组件…

Memory测试工具-lmbench使用详解

✨前言&#xff1a; 什么是lmbench&#xff1f; lmbench 是一个广泛使用的、开源的系统性能测量工具&#xff0c;它能对Unix-like操作系统&#xff08;包括Linux、BSD等&#xff09;进行全面的性能测试。这个套件包含了一系列针对不同系统组件&#xff08;如处理器、内存、文件…

吴恩达2022机器学习专项课程C2W2:2.23 选修_反向传播算法的工作原理(什么是导数图计算大型神经网络)

目录 引言一.导数的计算1.epsilon与导数的关系2.其它导数符号形式3.导数小结 二.小型神经网络的计算图1.什么是计算图&#xff08;前向传播过程&#xff09;2.反向传播计算过程3.验证反向传播的计算结果4.为什么用反向传播计算导数&#xff1f; 三.扩大神经网络的计算图1.计算反…

迅狐短剧小程序源码:打造个性化的追剧体验

随着移动互联网的普及&#xff0c;短剧小程序源码的开发成为了影视爱好者的新宠。它不仅为用户提供了便捷的追剧体验&#xff0c;还通过推荐系统、观看历史、个性化喜好等特色功能&#xff0c;满足了用户的多样化需求。本文将深入探讨短剧小程序源码的特点、优势以及如何实现多…

Linux和windows之间文件传输解决方案

我们初学Linux时&#xff0c;经常会在windows下载软件或者文档&#xff0c;然后想办法从windows上传输到Linux上&#xff1b;还有Linux上的文件&#xff0c;我们想再Windows上储存&#xff0c;这时&#xff0c;就会用到Linux和windows之间文件传输&#xff01;&#xff01; 一…

ant X6高亮

先附上效果图 // 节点内属性的点击事件&#xff1a;node:port:click graph.on(‘node:port:click’, ({ node, port }) > { resetAllHighlights(); highlightPort(node, port, true); highlightEdgesForPort(port, new Set()); }); // 以下为源码 <template><div…

Win11下只支持IE浏览器的老网站顺畅运行的方法

在Windows 11操作系统中&#xff0c;由于Internet Explorer&#xff08;IE&#xff09;浏览器的逐步淘汰&#xff0c;微软官方已不再直接支持IE浏览器。然而&#xff0c;当您遇到必须访问仅支持IE的老旧网站时&#xff0c;Windows 11仍然提供了一些实用的替代方案来应对这一挑战…

GA/T 1400视频汇聚平台EasyCVR级联后,平台显示无通道是什么原因?

国标GB28181安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台部署轻快&#xff0c;可支持的主流标准协议有GA/T 1400、国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。 有用户反馈&#xff…

【python】OpenCV—Bitplane

学习来自&#xff1a; 位平面分割&#xff08;Bit-Plane Slicing&#xff09;使用OpenCVPython进行图像处理的初学者指南 位平面 位平面&#xff08;bitplane&#xff09;是一个在计算机科学中用于描述图像数据的概念&#xff0c;具体定义如下&#xff1a; 【定义】&#x…

22、matlab锯齿波、三角波、方波:rectpuls()函数/sawtooth()函数/square()函数

1、采样的非周期性矩形 语法 语法1&#xff1a;y rectpuls(t) 返回一个以数组 t 中指示的采样时间采样的连续非周期性单位高度矩形脉冲&#xff0c;该矩形脉冲以 t 0 为中心。 语法2&#xff1a;y rectpuls(t,w) 生成一个宽度为 w 的矩形 参数 t:采样时间 w:矩形宽度…