https://vjudge.net/problem/CodeForces-867E

题意

一个物品在n天内有n种价格,每天仅能进行买入或卖出或不作为一种操作,可以同时拥有多种物品,问交易后的最大利益。

分析

贪心的取,当然是低买高卖。当买卖的顺序需要斟酌。考虑用小顶堆(优先队列)来维护这过程,我们每次得到一个新的价格,将其和堆顶的价格比较,如果比堆顶的价格低,就直接放入堆中,如果比堆顶的价格高,就意味着我们可以提前以堆顶的价格买入一个物品,然后以当前价格卖出,因此我们可以算出本次收益加到总收益中,这样我们就要将堆顶pop掉,然后将本次价格push两次入堆,push两次是因为我们若以堆顶的价格买入,不一定最终是以当前价格卖出的,当前价格有可能只是我们贪心的一个跳板,例如价格1,2,3,10,如果我们以1买入,2卖出,3买入,10卖出我们只能获得8,然而如果我们以1买入,10卖出,2买入,3卖出就可以获得10,我们贪心的过程中肯定会1买入2卖出,而这次2卖出只是我们10卖出的跳板,并不一定是非要在2卖出。

因此将某价格加入两次的作用分别是:

1.做中间价

2.做所有可能买入价中的一个(就和比堆顶低的价格直接扔入堆中一样的作用)

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <string>
  6. #include <algorithm>
  7. #include <cmath>
  8. #include <ctime>
  9. #include <vector>
  10. #include <queue>
  11. #include <map>
  12. #include <stack>
  13. #include <set>
  14. #include <bitset>
  15. using namespace std;
  16. typedef long long ll;
  17. typedef unsigned long long ull;
  18. #define ms(a, b) memset(a, b, sizeof(a))
  19. #define pb push_back
  20. #define mp make_pair
  21. #define pii pair<int, int>
  22. #define eps 0.0000000001
  23. #define IOS ios::sync_with_stdio(0);cin.tie(0);
  24. #define random(a, b) rand()*rand()%(b-a+1)+a
  25. #define pi acos(-1)
  26. const ll INF = 0x3f3f3f3f3f3f3f3fll;
  27. const int inf = 0x3f3f3f3f;
  28. const int maxn = + ;
  29. const int maxm = + ;
  30. const int mod = 1e9+;
  31.  
  32. priority_queue<int,vector<int>,greater<int> >q;
  33. int main(){
  34. #ifdef LOCAL
  35. freopen("in.txt", "r", stdin);
  36. // freopen("output.txt", "w", stdout);
  37. #endif
  38. int n;
  39. scanf("%d",&n);
  40. int x;
  41. ll ans=;
  42. for(int i=;i<n;i++){
  43. scanf("%d",&x);
  44. if(!q.empty()&&q.top()<x){
  45. ans+=x-q.top();
  46. q.pop();
  47. q.push(x);
  48. }
  49. q.push(x);
  50. }
  51. printf("%lld\n",ans);
  52. return ;
  53. }

CodeForces - 867E Buy Low Sell High (贪心 +小顶堆)的更多相关文章

  1. POJ 1456 - Supermarket - [贪心+小顶堆]

    题目链接:http://poj.org/problem?id=1456 Time Limit: 2000MS Memory Limit: 65536K Description A supermarke ...

  2. CF865D Buy Low Sell High 贪心

    正解:贪心 解题报告: 传送门! 这题首先有个很显然的dp,太基础了不说QAQ 然后考虑dp是n2的,显然过不去,所以换一个角度 然后发现这题和普通的dp的题有什么不同呢?就它这儿是一天只能买一支股, ...

  3. 【CF865D】Buy Low Sell High(贪心)

    [CF865D]Buy Low Sell High(贪心) 题面 洛谷 CF 题解 首先有一个\(O(n^2)\)的\(dp\)很显然,设\(f[i][j]\)表示前\(i\)天手中还有\(j\)股股 ...

  4. HDU 4006The kth great number(K大数 +小顶堆)

    The kth great number Time Limit:1000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64 ...

  5. heap c++ 操作 大顶堆、小顶堆

    在C++中,虽然堆不像 vector, set 之类的有已经实现的数据结构,但是在 algorithm.h 中实现了一些相关的模板函数.下面是一些示例应用 http://www.cplusplus.c ...

  6. python 基于小顶堆实现随机抽样

    起因:之前用蓄水池抽样,算法精简,但直观性很差. 所以这次采用了简单的,为没一个行,赋值一个随机值,然后取 最大的K个作为,随机样本. 基本思路:为每一个行(record,记录,实体) 赋一个rand ...

  7. Python使用heapq实现小顶堆(TopK大)、大顶堆(BtmK小)

    Python使用heapq实现小顶堆(TopK大).大顶堆(BtmK小) | 四号程序员 Python使用heapq实现小顶堆(TopK大).大顶堆(BtmK小) 4 Replies 需1求:给出N长 ...

  8. BZOJ 1150 - 数据备份Backup - [小顶堆][CTSC2007]

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1150 Time Limit: 10 Sec Memory Limit: 162 M De ...

  9. POJ 2442 - Sequence - [小顶堆][优先队列]

    题目链接:http://poj.org/problem?id=2442 Time Limit: 6000MS Memory Limit: 65536K Description Given m sequ ...

随机推荐

  1. 【BZOJ3814】【清华集训2014】简单回路 状压DP

    题目描述 给你一个\(n\times m\)的网格图和\(k\)个障碍,有\(q\)个询问,每次问你有多少个不同的不经过任何一个障碍点且经过\((x,y)\)与\((x+1,y)\)之间的简单回路 \ ...

  2. npm 常规错误

    Unexpected end of JSON input while parsing near 意外结束.JSON解析期间 解决办法: npm cache clean --force 解释:Force ...

  3. 【Vijos】lxhgww的奇思妙想(长链剖分)

    题面 给定一棵树,每次询问一个点的\(k\)次祖先,强制在线. Vijos 题解 长链剖分. 链接暂时咕咕咕了. 现在可以戳链接看题解了 #include<iostream> #inclu ...

  4. Codeforces | CF1037D 【Valid BFS?】

    题目大意:给定一个\(n(1\leq n\leq 2\cdot10^5)\)个节点的树的\(n-1\)条边和这棵树的一个\(BFS\)序\(a_1,a_2,\dots,a_n\),判断这个\(BFS\ ...

  5. Distinct Values(2018hdu多校第一场)

    给你一段长度为n的区间,然后在给你m个小区间,要求这m个小区间里的每个人都不能重复,请你输出字典序最小的方案. 我们可以开一个suf数组,表示我到我后面的不出现重复数字的区间至少需要到达的位置.所以对 ...

  6. MongoDB常用操作命令

    查看所有数据库: > show dbs; 选定数据库: > use ECommerce; 查看当前数据库状态: > db.stats(); 查看当前数据库中所有集合: > sh ...

  7. css 多行文本的溢出显示省略号(移动端)

    多行文本的溢出显示省略号(移动端) 一.单行文本的溢出显示省略号(通用) .mui-ellipsis { overflow: hidden; /*规定当文本溢出包含元素时发生的事情*/ white-s ...

  8. js定时器setInterval()与setTimeout()

    js定时器setInterval()与setTimeout() 1.setTimeout(Expression,DelayTime),在DelayTime过后,将执行一次Expression,setT ...

  9. JS小积累(一)— 判断在线离线

    JS小积累-判断在线离线 作者: 狐狸家的鱼 Github: 八至 if(window.navigator.onLine==true){ console.log('online'); ... } el ...

  10. 洛谷P1080 国王游戏

    两个难点. 怎么想到的贪心? 首先确定算法: 显然不是数据结构题.转成图论也不太可能. 考虑DP:f[i][j]表示前i个人取j状态的最小最大值......2^1000,直接放弃. 因为出现了“最大值 ...