【CF865D】Buy Low Sell High(贪心)
【CF865D】Buy Low Sell High(贪心)
题面
题解
首先有一个\(O(n^2)\)的\(dp\)很显然,设\(f[i][j]\)表示前\(i\)天手中还有\(j\)股股票的最大收益。转移显然。
然而这样子似乎并没有什么优化的余地。
考虑这样子一个贪心,假设我们已经知道了前面\(n-1\)天在最优答案的情况下的购买和卖出情况,只考虑最后这一天,那么你会找到一个可以买入股票的一天,并且其价格最小,然后和这一天的股票价格进行比较,如果更低,你就会在那一天买入股票,在这一天卖掉。
但是如果从头到尾每天都这样子进行贪心,那么显然是假的。
那么我们这么处理,维护一个堆表示之前的所有可行的决策,如果当前天的价格还要小于堆中的最小值,显然我们不会购买,直接把这个价格丢进堆里,否则会在堆顶那天买入,在这一天卖出,假设堆顶那一天的价格是\(x\),当天的价格是\(y\),那么就会得到\(y-x\)的收益。但是后面某天的决策可能是在那一天卖出,在第\(x\)天买入,所以往堆里面再插入一个\(x-(y-x)\),那么如果你在后面的某天购买到了这个\(x-(y-x)\),即表示你把当前这一天的卖出操作替换成了在后面那一天卖出,然后再在堆内插入一个\(y\),因为前面插入的元素一定会在这个\(y\)之前被弹出堆,因此只可能在这一天不卖之后才会用到这个\(y\),表示在这一天买入。
那么这样子贪心就好了。
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
#define ll long long
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
ll ans;int n;
priority_queue<int> Q;
int main()
{
n=read();Q.push(-read());
for(int i=2;i<=n;++i)
{
int y=read();
if(y<=-Q.top())Q.push(-y);
else ans+=y+Q.top(),Q.pop(),Q.push(-y),Q.push(-y);
}
printf("%I64d\n",ans);
return 0;
}
【CF865D】Buy Low Sell High(贪心)的更多相关文章
- CF865D Buy Low Sell High 贪心
正解:贪心 解题报告: 传送门! 这题首先有个很显然的dp,太基础了不说QAQ 然后考虑dp是n2的,显然过不去,所以换一个角度 然后发现这题和普通的dp的题有什么不同呢?就它这儿是一天只能买一支股, ...
- CF865D Buy Low Sell High
/* 贪心来选择, 如果能找到比当前小的, 就用最小的来更新当前的 优先队列即可 */ #include<cstdio> #include<algorithm> #includ ...
- LeetCode--Best Time to Buy and Sell Stock (贪心策略 or 动态规划)
Best Time to Buy and Sell Stock Total Accepted: 14044 Total Submissions: 45572My Submissions Say you ...
- CF867E: Buy Low Sell High(贪心, STL) (hdu6438)
Description 有nn个城市,第ii个城市商品价格为aiai,从11城市出发依次经过这nn个城市到达n n城市,在每个城市可以把手头商品出售也可以至多买一个商品,问最大收益. Input 第 ...
- CodeForces - 867E Buy Low Sell High (贪心 +小顶堆)
https://vjudge.net/problem/CodeForces-867E 题意 一个物品在n天内有n种价格,每天仅能进行买入或卖出或不作为一种操作,可以同时拥有多种物品,问交易后的最大利益 ...
- Buy Low Sell High CodeForces - 867E (思维,贪心)
大意: 第i天可以花$a_i$元买入或卖出一股或者什么也不干, 初始没钱, 求i天后最大收益 考虑贪心, 对于第$x$股, 如果$x$之前有比它便宜的, 就在之前的那一天买, 直接将$x$卖掉. 并不 ...
- Codeforces Round #437 E. Buy Low Sell High
题意:买卖股票,给你n个数,你可以选择买进或者卖出或者什么都不做,问你最后获得的最大收益是多少. Examples Input 910 5 4 7 9 12 6 2 10 Output 20 Inpu ...
- 【CodeForces】866D. Buy Low Sell High
[题意]已知n天股价,每天可以买入一股或卖出一股或不作为,最后必须持0股,求最大收益. [算法]堆 贪心? [题解] 不作为思想:[不作为=买入再卖出] 根据不作为思想,可以推出中转站思想. 中转站思 ...
- [ CodeForces 865 D ] Buy Low Sell High
\(\\\) \(Description\) 给出\(N\)天股票的价钱\(A_1,...,A_N\),每天可以什么都不做,或者买入或卖出\(1\)支股票,分别花出或收入\(A_i\)元,求最大收益 ...
随机推荐
- 堆排、python实现堆排
一.堆-完全二叉树 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),是不稳定排序 堆排序中的堆有大顶堆.小顶堆两种.他们都是完 ...
- net平台下c#操作ElasticSearch详解
net平台下c#操作ElasticSearch详解 ElasticSearch系列学习 ElasticSearch第一步-环境配置 ElasticSearch第二步-CRUD之Sense Elasti ...
- javaweb之Cookie学习
Cookie简介 HTTP是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分中两次请求是否由一个客户端发出.这样的设计严重阻碍的Web程序的设计.如:在我们进行网购时,买了一条裤子, ...
- HashSet中存放不重复元素
一.自定义对象存放在hashSet中,保证元素不重复.重写hashCode()和equals()方法 public class Student{ private String name; privat ...
- 自己实现数据结构系列五---BinarySearchTree
一.二分搜索树: 1.代码: public class BST<E extends Comparable<E>> { private class Node{ public E ...
- 消除element.style { }
1.在写前台页面时,我们会发现控制台里会自动出现一些样式覆盖掉我们定义的样式: 解决的办法: 把被覆盖的样式单独定义出来,并在样式后面加上 !important,表示高优先级.
- 994.Contiguous Array 邻近数组
描述 Given a binary array, find the maximum length of a contiguous subarray with equal number of 0 and ...
- Visual Studio2012调试时无法命中断点
今天在调试代码的时候发现在Debug模式下无法命中断点,然后一步步去检查原因,最后发现是在项目-->属性-->生成-->高级-->调试信息被设置为None,然后在选项中将其选择 ...
- vs code軟件操作
https://www.imooc.com/article/39349 https://www.html.cn/archives/8144
- How to split DMG on macOS
hdiutil segment /users/test/test1.dmg -segmentsize 4000m -o /users/test/test2.dmg