这题看起很简单,但是想法不好,代码就会又臭又长,想法好代码就很香了(x)
题意:依次经过n个城市,每个城市有物价ai,在每个城市只能买一、卖一或者什么都不做,求在买卖商品的最大毛利和最少交易次数(买卖都算一次交易),假设金钱无限。

思路:
1.首先假设手头有一些商品,来到一个物价更高的城市,为了最大毛利,肯定会把最便宜的i在此城市以aj的价格卖掉,获利aj-ai,交易次数是i买j卖。每次都是对最便宜的操作。

2.如果下一次来到了城市k,且ak>aj(也就是先前卖掉i物品的地方),那我们本应该把i在k卖掉更优,现在怎么办呢?其实这不影响我们计算答案,因为只要收益加上ak-aj即可,因为容易想到,ak-ai=(ak-aj)+(aj-ai)。那么交易次数呢?原先i~j的交易是两次,如果i~k交易那也是两次,也就是说“反悔”是不增加交易次数的。

3.根据2的发现,可知计算答案与具体哪个物品在哪交易没有直接关联,我们只需要知道曾经卖出的城市,是否被反悔。如果被反悔的话,为了最大化收益,我们都假设不卖就买(但不计数)。如果没有反悔,每次卖出,cnt+2,ans+差值。如果时因为反悔而选择的新的卖出地,cnt不变,ans+与上个卖出地的差值。

4.根据上面的分析,我们需要一个数据结构,遍历所有的地区,每次拿出最便宜的“商品”或者“卖出地”进行比较,
 如果当前地区物价不高于拿出的“商品”或者“卖出地”,那么没有收益,“商品”的形式存入结构。
 如果高于,那么可以有收益,取出这个“商品”或者“卖出地”,
  ans都加上差值,
   若是商品则cnt+2,
   若是卖出地则cnt不变,但是需要存入上个出卖地的商品,体现不卖则买。
  把当前卖出地存入结构。

5.讲到这里完全可以用结构体+优先队列小顶堆来做啦!结构体需要重载一下小于号,存入v和id,分别表示这个“商品”或者“卖出地”的价值,和上次出卖的地方(没有就记为inf,优先更新卖出地,使得交易次数最少)。稍微处理一下应该很好做。下面这份代码给出了更加“偷懒”的写法,用pair打标记,first是价值,second标签1是出卖地,标签2是商品,每次交易都把出卖地和商品都压入,由于排序的原因,出卖地总会在前面,那么如果出卖地被更新了,商品就会在排序中浮上来了。消耗空间多一点,但是非常轻松。
(typedef似乎快一些?)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;int main( )
{int T,n;scanf("%d",&T);while(T--){ll ans=0,cnt=0;priority_queue<pll,vector<pll>,greater<pll> >q;scanf("%d",&n);for(int v,i=1;i<=n;i++){scanf("%d",&v);if(!q.empty()&&q.top().first<v){cnt++;pll t=q.top();q.pop();if(t.second==1)cnt--;else cnt++;ans+=v-t.first;q.push({v,1});q.push({v,2});}else{q.push({v,2});}}printf("%lld %lld\n",ans,cnt);}return 0;
}/*
5
5
1 2 3 4 5
5
2 2 9 9 2
*/

HDU-6438丨优先队列相关推荐

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

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

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

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

  3. HDU 5437by cyl优先队列

    HDU 5437 题意: ​ 有个人要过生日,有k个朋友来拜访,但是他家里实在是有点小,只能依次让朋友进门,有m个特定的时间,每次可以进入p个人,每一个朋友来会带礼物,价值为v.主人还是比较贪心的,他 ...

  4. HDU 6438 Buy and Resell【贪心】

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

  5. Buy and Resell HDU - 6438 贪心

    题目描述: 有一个物品,给你这个物品n天的价格,你可以在在第i天买进或卖出或者什么都不做,如何获得最大利益,假设本金是无限大的. 分析: 我们建立一个最小堆,即优先队列,每天,将队列的最小值和当前的值 ...

  6. 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 ...

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

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

  8. HDU 幸福列车 优先队列

    幸福列车 一批幸福的列车即将从杭州驶向幸福的终点站――温州,身为总列车长的linle有一些奇怪的癖好. 他会记录下全部乘客的名字(name)和他们的人品值(RP),根据这些将他们排序,并不时地从某辆列 ...

  9. CCPC-2017 杭州站B丨HDU - 6265丨数论丨积性函数 丨欧拉函数丨狄利克雷卷积丨思维变换

    [参考博客]@WJHKDGHP ccpc2017杭州站 B [参考博客]@灬从此以后灬 2017 CCPC 杭州 HDU6265B 积性函数 特别感谢以上两位博主,让我看懂了许多细节. 交题网址(HD ...

  10. 优先队列详解(转载)

    优先队列:顾名思义,首先它是一个队列,但是它强调了"优先"二字,所以,已经不能算是一般意义上的队列了,它的"优先"意指取队首元素时,有一定的选择性,即根据元素的 ...

最新文章

  1. BAT架构师技术文档:Redis+Nginx+Dubbo精选+面试题+架构师精选视频(免费领)
  2. ElasticSearch2.2.0安装
  3. linux shell 脚本 查找文件,Linux Shell在目录下使用for循环结合if查找文件的巧用
  4. Eigen+suitesparse for windows 安装
  5. 【Quartz.net】- Cron表达式
  6. bzoj1966 [AHOI2005]病毒检测 结论+暴力
  7. 简单介绍几种Java后台开发常用框架组合
  8. Contextual Parameter Generation for Knowledge Graph Link Prediction
  9. gitLab私服-转帖记录
  10. 让 snoop 支持 .NET Core WPF 调试
  11. 响铃:金蝶的SaaS第一能保持多久?
  12. Unittest-单元测试3
  13. vscode文件图标消失
  14. dnf史诗计算机手机版,dnf计算器装备模拟100手机版
  15. 2016年美国数学奥林匹克竞赛试题
  16. 正则表达式不区分大小写以及解决思路的探索
  17. 剪辑技巧,简单几步骤即可混剪出多段视频素材
  18. 麻省理工学院、南加大等美国名校的网络安全:勉强及格
  19. 《毕业生》系列之四 霸面天源迪科
  20. 美颜预览卡顿问题跟踪

热门文章

  1. HTML初心自学记录(四)列表超链接
  2. 钉钉添加自定义机器人,实现每周定时@某人
  3. 实时文件同步软件--端端(Clouduolc)的诞生小记
  4. 计算机硬盘copy,diskgenius硬盘拷贝的方法
  5. 平均17.1K?2022软件测试员平均薪资出炉,看看你被平均了没~
  6. 210 Ruby 方法、类和模块【Rails后端开发训练营】
  7. 配置静态资源不重启即时生效
  8. 【LeetCode】347. Top K Frequent Elements 前 K 个高频元素(Medium)(JAVA)
  9. 英雄联盟 python 刷等级_厉害了,30行python代码爬取英雄联盟全英雄皮肤
  10. 高性能、分布式、低延迟的发布订阅中间件对比 Redis 和 emitter