弱校胡策 洛圣都(贪心)

洛圣都,一个庞大且阳光普照的繁华都市,充满了自我救赎的大师
们,贪官污吏们和落魄的名人们, 一群被羡慕着的西方世界的居民
却也正处于挣扎着生存的时代,衰落的经济和廉价的道义让这里混
乱不堪。
题目描述
当你刚刚踏入洛圣都,就看见拉玛尔走了过来。
“哦,兄弟,见到你可真高兴。”
“来吧这里是洛圣都, 你有我罩着包你满意。”
“我们最近发现了一桩好活儿”拉玛尔无不得意的说, “我们完全掌握了一种
股票的行情, 每天只需要到买倒卖,其他的什么也不做。要来试试吗?这才是
文明人的赚钱方式。 ”
你可以在接下来的 N 天内完全预测某种股票的价格,你可以利用这个知识获
利,但每天只能处理一份股票。 也就是说,你每天要么买一份, 要么卖一份,
要么什么也不做。 最初你拥有 0 份股票,当你不拥有任何股票时,你不能出售
股票。
在 N 天结束的时候, 你需要使自己手中的股票为 0, 但希望在 N 天的过程中赚
到尽量多的钱。
输入格式
输入文件 resell.in
第一行输入一个 N 表示天数。
接下来的 N 行每行一个整数 Pi 表示第 i 天某种股票的价格。
输出格式
输出文件 resell.out
一个整数为赚到的最大金额。
样例输入 1
9
10 5 4 7 9 12 6 2 10
样例输出 1
20
样例输入 2
20
3 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 2 3 8 4
样例输出 2
41
数据范围及提示
对于 30%的数据: 1<=n<=10
对于 100%的数据: 1<=n<=300000

题目来源:http://codeforces.com/contest/867/problem/E

30分:爆搜,不再赘述
100分:贪心!显而易见的是,为了赚到更多的钱,需要在价格较低时买入,价格较高时卖出。问题在于不知道具体在哪一天买入或者卖出更优。因此可以维护一个小根堆。 由于卖出的只能是先前已经买入的,所以小根堆中记录当天之前的信息。之后每加入一天的价格,将当前价格与堆顶(最小元素)比较,判断如果当前值>top,就卖掉,答案+=差值,然后推入两个当前值入堆,否则就直接买入。(推入两个当前值是因为这样可以保证答案的正确性,例如3,4,7,我们直接卖的话答案为7-3=4,这个同时也可以等效为(4-3)+(7-4)=4。也就是说,推入的其中一个值只是被当做中间变量更新答案)。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<queue>
using namespace std;
struct dqs
{
    int shu;
};
bool operator<(dqs a,dqs b)
{
    return a.shu>b.shu;
}
priority_queue<dqs>q;
int main()
{
    int n;
    long long ans=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int gp;
        dqs now;
        scanf("%d",&gp);
        now.shu=gp;
        if(!q.empty()&&q.top().shu<gp)
        {
            ans+=gp-q.top().shu;
            q.pop();
            q.push(now);
        }
        q.push(now);
    }
    printf("%lld\n",ans);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值