51Nod2206 低买高卖

Problem

考虑股票市场,一共有n天。
对于第i天,B君知道股票的价格是每单位a[i]元
在每一天,B君可以选择买入一个单位的股票,卖出一个单位的股票,或者什么都不做。
刚开始B君有无穷多的钱,但是没有任何股票。
问n天之后B君最多可以赚多少钱。
(1 <= n <= 200000)
(1 <= a[i] <= 10000)

Solution

一开始思路是如果四天递增,买卖买卖肯定不如买买卖卖,就从最高和最低贪心,但发现绕不过时间,就去翻题解了。

题解都是通过顺序来解决时间问题的。

变形比如只能拥有一支股票,每天可以买卖各一次,或者只能买或卖一次。做法2参考博客前面说的是哪种看不明白。

做法1:

51nod 2206 低买高卖&codeforces867E Buy Low Sell High

这个思路比较简单,如果堆空或者当前元素比堆顶元素小,就进堆,否则加入答案,弹出堆顶,进堆两次。

进堆两次是因为,如果轮到它做堆顶,再来一个最大的,可以理解为前面那次操作没有用它,正好还有一个它在堆里。如果又轮到它,就相当于又选了它。

那为什么没有第三次、第四次进堆呢?

可以看出这个数可能做一个中间量,如果第一次做完中间量以后再次成为堆中最小的,那么就必定买入,没有作为中间量的机会。

新来的更小的数或者第一个数就没有做中间量的机会。

做法2:

【51Nod】2206 低买高卖

直接加入两次,计算答案,弹出一次。

这样一看似乎会有答案增量为负的情形,但实际不会,因为如果当前加入的是比答案小的数,它会减掉自己,增量为0,然后弹出自己,第一个数一样,其余情况转化到做法1。

第一个用iostream快,第二个改成vector快,可能是iostream对于empty有优化?

Code1

#include<iostream>
#include<stdio.h>
#include<queue>
using namespace std;
int n;
long long ans;
priority_queue<int,vector<int>,greater<int> >q;
int main(){
    scanf("%d",&n);
    int x;
    while(n--){
        scanf("%d",&x);
        if(q.empty()||x<=q.top()){
            q.push(x);
        }
        else{
            ans+=x-q.top();
            q.pop();
            q.push(x);
            q.push(x);
        }
    }
    printf("%I64d\n",ans);
    return 0;
}

Code2

#include<stdio.h>
#include<queue>
#include<vector>
using namespace std;
int n;
long long ans;
priority_queue<int,vector<int>,greater<int> >q;
int main(){
    scanf("%d",&n);
    int x;
    while(n--){
        scanf("%d",&x);
        q.push(x);
        q.push(x);
        ans+=x-q.top();
        q.pop();
    }
    printf("%I64d\n",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/sz-wcc/p/11620480.html

时间: 2024-11-08 11:18:46

51Nod2206 低买高卖的相关文章

已知股价序列,计算在什么时候买和卖获益最大

问题:一个股价序列,已知每个时间点的股价,问什么时候买和卖获利最大?时间复杂度O(n). 假设股价按照时间点顺序放在了一个数组里,假设股价有升有降,就是说股价序列不是递减的.需要记录买入点和卖出点(用数组下标代替). (1)获利最大值初始化为INT_MIN.买入股价和买入点初始化为数组的第一个元素. (2)从第二个元素开始遍历数组,如果当前股价比买入股价高,则求获利值.如果比当前获利最大值大,则修改获利最大值和卖出点. (3)如果当前股价小于等于买入股价,则把买入股价和买入点置为当前点. 代码如

多买高性价比东西

买东西应该秉承不买贵的,只买对的的原则,但绝大多数情况下,贵的东西肯定更好,所以更应该衡量的是性价比.在能够承担的范围内,可以优先考虑性价比高的,哪怕贵一点也没关系.比如最近几年买的这些东西: Cherry 原厂机械键盘(红轴和茶轴):转行之前在电网,经常要写汇报材料,用机械键盘打字绝对是一种享受,现在需要敲代码,就更离不开机械键盘了.这两个键盘买了四.五年了,还是一如既往地好用,只是定期需要把键都卸下来擦一擦,不然都是灰尘. Retina MacBook Pro:15 年初托小哥从香港带回来的

面向对象三大特性五大原则 + 低耦合高内聚

面向对象三大特性五大原则 + 低耦合高内聚 面向对象的三大特性是"封装."多态"."继承",五大原则是"单一职责原则"."开放封闭原则"."里氏替换原则"."依赖倒置原则"."接口分离原则". 什么是面向对象 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结

农村淘宝不再把目标局限在买货卖货送货的电商之上?未来农村电商将如何发展呢?又存在哪些问题呢?

阿里巴巴又造了个节日——乡村文化节,农村淘宝项目启动已近两年,不再把目标局限在买货卖货送货的电商之上?那么未来农村电商将如何发展呢?又存在哪些问题呢?其实农村既是巨大的商机所在,同时又有着落后和空心化的现实,下面我们跟着开网店怎么找货源小编一起来了解下关于农村电商的发展和当前存在的问题. 农村淘宝项目启动已近两年,在经历了一系列探索之后,其模式也完成了从1.0到3.0的转变.而在覆盖了内地29个省300个县之后,阿里巴巴不再把目标局限在买货卖货送货的电商之上,而是要集中阿里内部以及社会资源,从教

低耦合,高内聚真的好吗?

首先来看看什么是"低耦合,高内聚",这里简单介绍一下:内聚描述的是模块内的功能联系:从功能角度来度量模块内的联系,一个好的内聚模块应当恰好完成一个任务.耦合是软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度.进入或访问一个模块的点以及通过接口的数据. 另外"高内聚低耦合",也是软件工程中的概念,是判断设计好坏的标准,或许也可以说是设计软件所追求的目标,那么是否就是说离这个目标越近软件设计的就越好呢!如果从可维护性,可扩展性,后续架构来说,能

《如何在struts+spring+hibernate的框架下构建低耦合高内聚的软件》

问题的提出我常常在思考一个问题,我们如何能设计出高水平.高质量的软件出来.怎样是高水平.高质量的软件?它应当是易于维护.易于适应变更.可重用性好的一个系统.如何做到这一点呢?答案当然是"低耦合.高内聚"了.低耦合就是软件在构造的时候,各个模块.各个功能.各个类都不会过度依赖于它周围的环境.只有这样,才能使我们的模块(功能.类)在周围发生变更时不受影响,做到易于维护和易于适应变更.正因为如此,也使它更易于重用到其它功能类似的环境中,提高了重用性.高内聚则使软件中的各个模块(功能.类)能够

C# 低耦合 高内聚

低耦合 loosely Coupling 松散的耦合关系=炮友 couple=夫妻 夫妻=法律约束.家庭.生活.财产.繁衍 炮友:吃喝玩乐,不会产生感情方面的依赖 内聚性 内聚性又称块内联系.指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量.若一个模块内各元素(语名之间.程序段之间)联系的越紧密,则它的内聚性就越高. 内聚性匪类(低――高): 偶然内聚;逻辑内聚;时间内聚;通信内聚;顺序内聚;功能内聚; 1 偶然内聚: 指一个模块内的各处理元素之间没有任何联系. 2 逻辑内

cpu使用率低负载高,原因分析

原因总结 产生的原因一句话总结就是:等待磁盘I/O完成的进程过多,导致进程队列长度过大,但是cpu运行的进程却很少,这样就体现到负载过大了,cpu使用率低. 下面内容是具体的原理分析:在分析负载为什么高之前先介绍下什么是负载.多任务操作系统.进程调度等相关概念. 什么是负载 什么是负载:负载就是cpu在一段时间内正在处理以及等待cpu处理的进程数之和的统计信息,也就是cpu使用队列的长度统计信息,这个数字越小越好(如果超过CPU核心*0.7就是不正常) 负载分为两大部分:CPU负载.IO负载 例

低耦合高聚合,封装原则

(oop)面向对象编程的一个关键原则之一就是封装,把暴漏的数据封装起来,尽可能的让对象管理它们自己的状态,因为过多的依存性会造成紧耦合性系统,使得任意一点小的改动都可能造成许多无法预料的结果.而数据封装机制是一个控制对象数据和状态强有力的方法,它对外部世界隐藏其内部细节,这就意味着每一个对象都应该尽可能少的了解系统的其他部分或者被其他部分所了解,这样一来一旦发生了变化,需要了解这一个变化的对象会比较少,因此变化也就相对来说便于改动. 内聚:内聚指的是一个模块内部各部分之间的关联程度,一个好的内聚