博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解
阅读量:6333 次
发布时间:2019-06-22

本文共 911 字,大约阅读时间需要 3 分钟。

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

1.当做中间价/最终卖出价

2.买入价

所以我们入队两个w,如果w是买入价,那么其中一个w作为中间价势必弹出,另一个w作为买入价;如果w是最终卖出价,那么两个w会一直待在队列里。

计算总数很简单,用map[i]表示以i为中间价还存在多少个,如果是中间价就不加数量。

记得开long long orz

参考:

代码:

#include
#include
#include
#include
#include
#define ll long longusing namespace std;priority_queue
, greater
> q;map
st;int main(){ int T, n, w; scanf("%d", &T); while(T--){ st.clear(); while(!q.empty()) q.pop(); scanf("%d", &n); ll num = 0, ans = 0; for(int i = 0; i < n; i++){ scanf("%d", &w); if(!q.empty() && q.top() < w){ if(st[q.top()] > 0){ st[q.top()]--; } else{ num += 2; } st[w]++; ans += w - q.top(); q.pop(); q.push(w); } q.push(w); } printf("%lld %lld\n",ans, num); } return 0;}

 

转载于:https://www.cnblogs.com/KirinSB/p/9536670.html

你可能感兴趣的文章
计算rem单位
查看>>
第七章 大网高级 ASA
查看>>
rsync+inotify触发式远程同步
查看>>
优秀设计师应当知道的几大UI设计原则(一)
查看>>
mongodb高级查询
查看>>
struts2.1 struts.devMode BUG解决方案
查看>>
日本法院裁定三星诉苹果专利侵权案败诉
查看>>
Windows Server 2012R2 桌面体验问题直通车
查看>>
桌面支持--复印证件技巧
查看>>
Silverlight实用窍门系列:50.InkPresenter涂鸦板的基本使用,以及将效果保存为Png图片【附带源码实例】...
查看>>
MySQL数据库经典书籍share
查看>>
给出三个数,要求输出 最大的一个
查看>>
Linux系统中获取帮助的方法及Linux系统的哲学思想
查看>>
在windows环境创建,安装windows服务
查看>>
Nginx请求反向代理
查看>>
golang的GJSON库
查看>>
mybatis 中的<![CDATA[ ]]>
查看>>
Springboot配置文件读取报错Configuration property name 'projectUrl' is not valid:
查看>>
HTTP状态码
查看>>
今天的学习
查看>>