贪心算法拓展(反悔贪心)

        相信大家对贪心算法已经见怪不怪了,但是一旦我们的决策条件会随着我们的步骤变化,我们该怎么办呢?有没有什么方法可以反悔呢?

        今天就来讲可以后悔的贪心算法,反悔贪心。

https://www.luogu.com.cn/problem/CF865Dicon-default.png?t=N7T8https://www.luogu.com.cn/problem/CF865D

题目描述

        You can perfectly predict the price of a certain stock for the next 𝑁 days. You would like to profit on this knowledge, but only want to transact one share of stock per day. That is, each day you will either buy one share, sell one share, or do nothing. Initially you own zero shares, and you cannot sell shares when you don't own any. At the end of the 𝑁 days you would like to again own zero shares, but want to have as much money as possible.

输入格式

Input begins with an integer 𝑁N (2<=𝑁<=3⋅105), the number of days.

Following this is a line with exactly 𝑁N integers 𝑝1,𝑝2,...,𝑝𝑁(1<=𝑝𝑖<=106) . The price of one share of stock on the 𝑖 -th day is given by 𝑝𝑖​ .

输出格式

Print the maximum amount of money you can end up with at the end of 𝑁 days.

输入输出样例

输入 #1

9
10 5 4 7 9 12 6 2 10

输出 #1

20

输入 #2

20
3 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 2 3 8 4

输出 #2

41

        就像买卖股票,谁都不知道接下来股票的趋势,但如果我们知道了趋势,又如何让自己的收益最大化呢?

        因此,我们可以先考虑两种情况:

        一:当第一天的价格高于第二天时,我们就只要屯着,因为卖出去是没有收益的。

        二:反之,我们每次遇见第二天的价格高于第一天时,我们就直接先考虑卖出(能赚一点是一点),我们会获得收益,那假如之后价格更高怎么办?当然是反悔了,我们用一个小根堆来存储已经路过的天数,秉承着只要有钱赚就卖的原则,我们充分利用priority_queue的强大优势,当堆顶元素比当日价格低的时候,我们就卖掉(映射到代码就是pop()),然后将总获利加上差价,就是买股票的钱,那么怎么反悔呢,我们在pop堆顶元素的时候,将一个当日的股价压入堆,无论在哪里,只要堆不空,那么只要有股价高于堆顶元素的就重复以上步骤,这样做不会舍弃更高的利润,而是将难以维护的决策变成了类似滚雪球一样的方式,这就是反悔贪心的核心操作。比较抽象,需要仔细理解体会。

        最后附上完整代码:

#include <bits/stdc++.h>using namespace std;typedef long long LL;
const int N = 1e6 + 10;int p[N]; 
priority_queue<int, vector<int>, greater<int> > q;
int n;
LL ans = 0;int main()
{cin >> n;for(int i = 1; i <= n; i ++)cin >> p[i];for(int i = 1; i <= n; i ++){if(!q.empty() && p[i] > q.top()){ans += p[i] - q.top();q.pop();q.push(p[i]);}q.push(p[i]);}cout << ans << endl;
}

        tip:这是一次CF上的题,在洛谷上提交的时候要记得绑定CF账号哦>_<!!!

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

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

相关文章

C++栈、队列

文章目录 目录 文章目录 前言 一、stack、queue介绍 1.stack 2.queue 二、stack、queue的习题 1. 最小栈 2. 栈的压入、弹出序列 3.二叉树的层序遍历 三、stack和queue的模拟实现 1.stack的模拟实现 2.queue的模拟实现 前言 栈和队列是俩种特殊的容器&#xff0c;C在实现栈和队…

Go Go-Simple-Mail包进行批量SMTP邮件发送

go-simple-mail 包提供了一种简便的方式来处理和发送邮件。这个包支持保持活动连接、TLS和SSL加密协议,非常适合批量SMTP邮件发送需求。 1、安装Go-Simple-Mail包 go get -u github.com/xhit/go-simple-mail/v2 2、配置SMTP服务器连接 go-simple-mail包支持多种SMTP服务器…

强达电路营收下滑净利润急剧放缓:周转率骤降,2次因环保被罚

《港湾商业观察》施子夫 自2022年6月向深交所创业板递交招股书起&#xff0c;深圳市强达电路股份有限公司&#xff08;以下简称&#xff0c;强达电路&#xff09;已收到深交所下发的两轮审核问询函&#xff0c;并且公司已于2023年3月31日顺利过会。但由于迟迟未提交注册申请&a…

无实验数据指导蛋白质定向进化,上海交大洪亮课题组发表微环境感知图神经网络 ProtLGN

在现代生物技术和医药研究中&#xff0c;蛋白质工程扮演着至关重要的角色。通过修改蛋白质的氨基酸序列&#xff0c;蛋白质工程可以改善或赋予蛋白质新的生物化学性质&#xff0c;如增强酶的催化效率、提高药物的亲和力或改善其热稳定性。这些改进对于开发新药、治疗疾病以及提…

lua vm 一: attempt to yield across a C-call boundary 的原因分析

使用 lua 的时候有时候会遇到这样的报错&#xff1a;“attempt to yield across a C-call boundary”。 1. 网络上的解释 可以在网上找到一些关于这个问题的解释。 1.1 解释一 这个 issue&#xff1a;一个关于 yield across a C-call boundary 的问题&#xff0c;云风的解释是…

【最新鸿蒙应用开发】——实用广告思路,可动态修改(方便运营)

鸿蒙项目加入广告展示页业务 广告页的思路——华为有广告业务&#xff0c;但是我们不用- ad模块&#xff1b; 想自定义广告——场景&#xff1a; app启动-有广告需求&#xff0c;就打开广告页&#xff0c;没有的话就去登录或者主页&#xff1b; 腾讯体育的广告- 启动有广告页…

适合小白学习的项目1894java开发ssm框架校园跑腿管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java ssm 校园跑腿管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采…

Java项目:96 springboot精品在线试题库系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 这次开发的精品在线试题库系统有管理员&#xff0c;教师&#xff0c;学生三个角色。 管理员功能有个人中心&#xff0c;专业管理&#xff0c;学生管理…

比较(二)利用python绘制雷达图

比较&#xff08;二&#xff09;利用python绘制雷达图 雷达图&#xff08;Radar Chart&#xff09;简介 雷达图可以用来比较多个定量变量&#xff0c;也可以用于查看数据集中变量的得分高低&#xff0c;是显示性能表现的理想之选。缺点是变量过多容易造成阅读困难。 快速绘制…

Go语言 一些问题了解

一、读取文件数据&#xff0c;是阻塞还是非阻塞的&#xff1f; 分两种情况&#xff1a;常规读取文件数据&#xff0c;和网络IO读取数据 1. 常规读取文件数据&#xff1a; io.Reader 和 bufio.Reader 是同步进行的。 bufio.Reader 提供缓冲的读取操作&#xff0c;意味着数据是…

网站入门:Flask用法讲解

Flask是一个使用Python编写的轻量级Web服务框架&#xff0c;旨在帮助开发人员快速构建和部署Web应用程序。下面将对Flask进行更为详细的解释说明&#xff0c;并展示其使用示例与注意事项&#xff1a; 1.解释说明 定义及特点: Flask以其简洁和灵活著称&#xff0c;允许开发者以…

C++:list模拟实现

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《C&#xff1a;list模拟实现》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 如果本篇文章对你有帮助&#xff0c;还请各位点点赞&#xff01;&#xf…

LeetCode题练习与总结:二叉树展开为链表--114

一、题目描述 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。 …

深入探讨Java字符串拼接的艺术

引言 在Java编程中&#xff0c;字符串是最基本的数据类型之一。字符串拼接是开发过程中一个非常常见的操作&#xff0c;无论是构建用户界面的文本&#xff0c;还是生成日志信息&#xff0c;都离不开字符串的拼接。然而&#xff0c;字符串拼接的效率和正确性常常被开发者忽视&a…

格式化数据恢复指南:从备份到实战,3个技巧一网打尽

朋友们&#xff01;你们有没有遇到过那种“啊&#xff0c;我的文件呢&#xff1f;”的尴尬时刻&#xff1f;无论是因为手滑、电脑抽风还是其他原因&#xff0c;数据丢失都可能会让我们抓狂&#xff0c;甚至有时候&#xff0c;我们可能一不小心就把存储设备格式化了&#xff0c;…

香橙派OrangePI AiPro测评 【运行qt,编解码,xfreeRDP】

实物 为AI而生 打开盒子 配置 扛把子的 作为业界首款基于昇腾深度研发的AI开发板&#xff0c;Orange Pi AIpro无论在外观上、性能上还是技术服务支持上都非常优秀。采用昇腾AI技术路线&#xff0c;集成图形处理器&#xff0c;拥有8GB/16GB LPDDR4X&#xff0c;可以外接32…

进程通信——管道

什么是进程通信&#xff1f; 进程通信是实现进程间传递数据信息的机制。要实现数据信息传递就要进程间共享资源——内存空间。那么是哪块内存空间呢&#xff1f;进程间是相互独立的&#xff0c;一个进程不可能访问其他进程的内存空间&#xff0c;那么这块空间只能由操作系统提…

什么是RPA自动化办公?

RPA自动化办公&#xff1a;提升效率的利器 如今&#xff0c;自动化办公已成为提升效率、减少错误、节省成本的关键手段。RPA&#xff08;机器人流程自动化&#xff0c;Robotic Process Automation&#xff09;作为其中的重要组成部分&#xff0c;正受到越来越多企业的青睐。那…

【全开源】简单商城系统源码(PC/UniAPP)

提供PC版本、UniAPP版本(高级授权)、支持多规格商品、优惠券、积分兑换、快递鸟电子面单、支持移动端样式、统计报表等 提供全部前后台无加密源代码、数据库离线部署。 构建您的在线商店的基石 一、引言&#xff1a;为什么选择简单商城系统源码&#xff1f; 在数字化时代&am…

【Spring Cloud Alibaba】初识Spring Cloud Alibaba

目录 回顾主流的微服务框架Spring Cloud 版本简介Spring Cloud以往的版本发布顺序排列如下&#xff1a; 由停更引发的"升级惨案"哪些Netflix组件被移除了&#xff1f; 替换方案服务注册中心&#xff1a;服务调用&#xff1a;负载均衡&#xff1a;服务降级&#xff1a…