股神小L 2016Vijos省选集训 day1

Posted 神犇(shenben)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了股神小L 2016Vijos省选集训 day1相关的知识,希望对你有一定的参考价值。

股神小L (stock.c/pas/cpp)
============================

小L厌倦了算法竞赛,希望到股市里一展身手。他凭借自己还行的计算机功底和可以的智商,成功建立一个模型预测了一支股票接下来n天的价格。

我们把这支股票第i天的价格称为a_i。在接下来n天里,每一天小L可以选择花费a_i买入一股或者卖出一股从而获得a_i元收入。

当然小L卖出股票的时候,自己的账户上必须要有至少一股的剩余。现在小L希望知道,在n天过去之后,采取最优策略的情况下自己最多赚到多少钱。

注意小L家产万贯,可以视为初始本金为无穷,另外每一天小L能且只能进行一次买或卖的操作,不能什么都不做。

输入格式
一行一个数n,表示接下来n天
接下来了n行,每行一个正整数,表示股票在这一天的价格。

输出格式
一行一个整数,表示小L的最大获利,如果小L赔钱,则输出相应的负数

样例输入1
4
1 3 2 4

样例输出1
4

样例输入2
4
1 2 3 4

样例输出2
4

数据范围
对于10%的数据, 1 <= n <= 200
对于30%的数据, 1 <= n <= 3000
对于100%的数据, 1 <= n, a_i <= 200000

评测环境:Win7+Lemon

//100分贪心 
#include<cstdio>
#include<iostream>
#include<ext/pb_ds/priority_queue.hpp>
#define FRE(name) freopen(#name".in","r",stdin);freopen(#name".out","w",stdout);
using namespace std;
__gnu_pbds::priority_queue<int,greater<int> >q;
inline int read(){
    int x=0;char ch=getchar();
    while(ch<0||ch>9){ch=getchar();}
    while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();}
    return x;
}
const int N=2e5+5;
int n,a[N];
long long sum,ans;
int main(){
    FRE(stock)
    n=read();
    for(int i=1;i<=n;i++) sum+=(a[i]=read());
    for(int i=2,t;i<=n;i++){
        if(i&1){
            t=q.top();
            if(a[i]>t){
                ans+=a[i]-t;q.pop();
                q.push(a[i]);
            }
        }
        else ans+=a[i],q.push(a[i]);
    }
    cout<<ans*2-sum;
    return 0;
}
/*30分 
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=3005;
const int inf=0x3f3f3f3f;
int n,ans,a[N],f[N][N];
int main(){
    freopen("stock.in","r",stdin);
    freopen("stock.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++){
        for(int j=0;j<=n;j++){
            f[i][j]=-inf;
        }
    }
    //f[1][0]=0;WA*1
    f[1][1]=-a[1];
    for(int i=2;i<=n;i++){
        for(int j=0;j<=n;j++){
            if(f[i-1][j]!=-inf){
                if(j<n) f[i][j+1]=max(f[i][j+1],f[i-1][j]-a[i]);
                if(j>0) f[i][j-1]=max(f[i][j-1],f[i-1][j]+a[i]);
            }
        }
    }
    for(int i=0;i<=n;i++) ans=max(ans,f[n][i]);
    printf("%d",ans);
    return 0;
}
*/

 

以上是关于股神小L 2016Vijos省选集训 day1的主要内容,如果未能解决你的问题,请参考以下文章

2016vijos 1-2 股神小L(堆)

[2016北京集训试题14]股神小D-[LCT]

2017雅礼省选集训做题记录

股神小L [贪心]

股神小D [点分治 or LCT]

HNOI2015省选集训题