题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6438

题意:一个奸商在倒卖石油,对于每个城市都有不同的石油的价格,当奸商按顺序到达某个城市之后,他可以有3种操作:

1.买一个石油

2.卖一个石油

3.什么都不做的走开

现在按顺序给出每个城市的石油价格,求最大获利,和最少的交易次数。

题解:第一眼看到这个问题,觉得是个DP,想了半天没想出来,后来看题解才知道,是个贪心。

怎么贪心呢?

我们要求获利最大,所以必定低价买入高价卖出。但是我们会考虑到一个问题,就是什么时候卖?换句话说就是可能当前卖出买入价格最小的石油,获利也许不是最大。如 1  3 10这个样例,很明显在1的价格位置买入,3的价格卖出,是可以赚钱的,但是不是最优解。所以我们需要思考怎么“后悔”。

我们很容易可以发现加入 在 A地方买入 B地方卖出,再在B地方买入,在C地方卖出。其实等价于 A地方买入 C地方卖出。用样例解释一波:

还是1 3 10这个样例。我们在1价格买入,3价格卖出,获利2.再以3价格买入,然后在10价格卖出,获利7.把获利加起来就是9,实际上等同于在1价格买入,在10价格卖出。

这个先卖出,再次买入就是我们的“后悔”操作。

具体实现如下:

对于当前城市的价格比我最小值小的,就意味着我们在这城市没有获利,我们低价买入。

对于当前城市的价格比我最小值大的,就意味着我们在这城市卖出会有获利,我们选择卖出买入的最小值。并且记录我们获利的多少。为了我们能后悔我们选择再次以当前价格买入。我们要买两次,为什么要买两次的。首先我们第一次表明我们是以当前价格卖出,若以后还能有更优值,就可以把这个卖出去。这就是卖出再买入然后在卖出的操作。对于这样的操作我们实际上只需要记录为一次交易即可,即最初的买和最后的卖。相当于我加了个跳板。那么第二次就表明。我们是以这个价格买入的。就可以在后面将他卖出。因为若便利到这个价格就以为,你之前的最小值已经在更优的位置被卖出去了,现在才是最小值。

所以实际上我们就是对手中持有的石油进行了分类。跳板or非跳板,卖出跳板时次数不变,卖出非跳板时次数+2.手中持有的石油用优先队列维护。

这个题还是蛮难理解的(也行是我太菜)希望这篇详细的博客能给大家启发。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int mx = 1e5+5;struct node{ int val,type; // type表示分类 0 表示跳板, 2 表示非跳板 bool operator <(const node b) const{if(val != b.val) return val > b.val;  // 按照权值从小到大 return type > b.type; // 按照类型从小到大。 }
};priority_queue<node> Q;
int main(){int z;scanf("%d",&z);while(z--){while(!Q.empty()) Q.pop();int n,sum = 0;long long ans = 0;node temp ;scanf("%d",&n);for(int i = 1 ; i <= n ; i ++){int val ;scanf("%d",&val);temp.val = val;temp.type = 2; // (非跳板)买入就是类型2 if(!Q.empty() && val > Q.top().val){ // 若当前能赚钱就买出最小值 ans += val - Q.top().val; //统计获利 sum += Q.top().type; // 为什么type是0 和2呢 0表示无效交易,2表示有效交易 。 temp.type = 0;  Q.pop();Q.push(temp); //加入两次,当中后悔药使用。 temp.type = 2;Q.push(temp);}elseQ.push(temp);}printf("%lld %d\n",ans,sum);}return 0;
}

HDU 6438 Buy and Resell (优先队列 or 贪心)相关推荐

  1. HDU - 6438 Buy and Resell(思维+ 贪心)

    题目链接 题意 t组输入,每组n个城市,给出每个城市的货物的价格,在每个城市可以进行三个操作:购买货物,卖出货物,不做操作,问从城市1到城市n(不能返回)最多能获得多少利润,且操作数最少(买和卖分别算 ...

  2. HDU 6438 Buy and Resell【贪心】

    http://acm.hdu.edu.cn/showproblem.php?pid=6438 Problem Description The Power Cube is used as a stash ...

  3. Buy and Resell(贪心好题!)

    这个贪心可以说是很巧妙了. Buy and Resell Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K ( ...

  4. hdu6438 Buy and Resell 买卖物品 ccpc网络赛 贪心

    题目传送门 题目描述: 有n座城市,每座城市都可以对一个物品进行一次的买进或者卖出,可以同时拥有多个物品,计算利润最大值,并且交易次数要最少.(买入卖出算两次操作) 思路: 建立两个小根堆 优先队列, ...

  5. HDU - 6438(贪心+思维)

    链接:HDU - 6438 题意:给出 n ,表示 n 天.给出 n 个数,a[i] 表示第 i 天,物品的价格是多少.每天可以选择买一个物品,或者卖一个已有物品,也可以什么都不做,问最后最大能赚多少 ...

  6. HDU6348 Buy and Resell

    Bryce1010模板 HDU6348 Buy and Resell 题意: 从前往后开始旅游,在每个村庄可以选择三个操作: (1)买入物品 (2)卖出物品 (3)不买不卖 求最后的最大获益. 思路: ...

  7. Buy and Resell

    题目链接: Buy and Resell 大致题意: 有n个城市, 在每个城市中你可以选择花费a[i]的价格买一个能量块, 也可以选择以a[i]的价格卖出一个能量块(前提是你要有能量块可以卖). 你会 ...

  8. 2018中国大学生程序设计竞赛 – 网络选拔赛 1001 Buy and Resell [模拟]

    1001 Buy and Resell  题目:有1-n个货物,可以在某个点buy,然后在后面的点resell,可以同时买多个,问最大的利润和最小的交易次数. 题解:模拟运算,前 i 天都是可以买的, ...

  9. HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解

    思路:维护一个递增队列,如果当天的w比队首大,那么我们给收益增加 w - q.top(),这里的意思可以理解为w对总收益的贡献而不是真正获利的具体数额,这样我们就能求出最大收益.注意一下,如果w对收益 ...

  10. Buy and Resell HDU - 6438(补)更新贪心

    The Power Cube is used as a stash of Exotic Power. There are nn cities numbered 1,2,-,n1,2,-,n where ...

最新文章

  1. mysql 查询实体_mysql – 如何优化实体框架查询
  2. 脂肪粒和淋巴结肿大的外形可否区分
  3. E - Flow Gym - 102471E
  4. python有多少种模块_python如何查看有哪些模块
  5. 怎么把线稿提取出来_如何快速提取漫画线稿?【漫画技巧】
  6. 【LeetCode】 sort list 单清单归并
  7. Nginx基础详细讲解
  8. 乐视电视刷android tv,乐视超级电视升级系统方法详细教程攻略
  9. echarts-横坐标文字竖排显示和倾斜45°显示
  10. UCF Local Programming Contest 2018题解
  11. java基础(一)基础认识、数据类型
  12. review代码从哪些角度_转载:CodeReview正确的姿势是什么?
  13. JAVA通过tcp通信劳易测BCL 308i扫码枪获取数据
  14. 给定一个完全循环赛的比赛结果,其中n个队伍两两比赛一次。每场比赛以一方胜出或者平局结束。设计一个算法,把n个队伍排序,序列中每个队伍都不曾输给紧随其后的那个队伍。说明该算法的时间效率类型。
  15. PLC模拟量输入 模拟量转换FB S_ITR(三菱FX3U)
  16. HANA DB重置SYSTEM密码
  17. c语言中不定积分如何编写程序,谁能举个例子教我一下C语言的定积分运算
  18. 相位同步、频率同步、同相位时钟、同源时钟、同时钟域时钟和异步时钟区别。
  19. c语言实例 魔术师的猜牌术(1),C语言实例:魔术师的猜牌术(1)
  20. rabbitmq-plugins enable rabbitmq_management Failed to start Elixir.

热门文章

  1. Cadence Allegro怎么从2层板添加层到4层板
  2. java短信验证码功能发送的验证码如何校验_java实现发送短信验证码
  3. Qt设计的一个图片查看器
  4. rust中slice panicked at 'byte index 5 is not a char boundary' 问题解决办法
  5. [SSL_CHX][2021-08-25]车厢重组
  6. 软件测试员比软件开发员要求低些吗?
  7. LIO-SAM回环检测模块代码解析
  8. 霸屏综艺,牵手明星,扩列神器皮皮APP的出圈始末
  9. 一起听、一起看、一起唱掀起Z世代青年社交浪潮
  10. 程序员要拥抱变化,聊聊Android即将支持的Java 8