热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CF865D

这道贪心非常神仙大体想法肯定是选择一个价格较低的一天买入并在之后找一个价格较高的一天卖出直接贪心的选显然不可行,考虑如何实现“反悔”这里直接说做法,反正我也想不到从前向后扫描每一天

这道贪心非常神仙

大体想法肯定是选择一个价格较低的一天买入
并在之后找一个价格较高的一天卖出

直接贪心的选显然不可行,考虑如何实现“反悔”

这里直接说做法,反正我也想不到= =

从前向后扫描每一天,若当前价格比堆顶还小就入堆

否则,将从堆顶买入并从当天卖出,弹出堆顶,并将当天价格入堆两次

这里解释一下入堆两次的道理

如果之后有一天价格更高,可以借助其中入堆的一个值反悔,
相当于从那次的堆顶买入,价格更高的这天卖出

而如果有这次反悔,相当于那天并没有进行操作
这时候多入堆的那次就有用了

这样以后它作为堆顶之后,就相当于在那天买入后边卖出了


 

代码:

#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int MAXN = 300005;
int n;
int p[MAXN];
ll ans;
priority_queue q;
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
scanf("%d", &p[i]);
for(int i = 1; i <= n; ++i) {
if(q.empty() || -q.top() > p[i]) q.push(-p[i]);
else {
ans += q.top();
q.pop();
ans += p[i];
q.push(-p[i]);
q.push(-p[i]);
}
}
printf("%lld\n", ans);
return 0;
}


推荐阅读
author-avatar
6057318491
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有