码迷,mamicode.com
首页 > 其他好文 > 详细

股神小L 2016Vijos省选集训 day1

时间:2017-02-13 21:37:12      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:格式   算法   建立   接下来   scan   include   namespace   输出   pen   

股神小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

标签:格式   算法   建立   接下来   scan   include   namespace   输出   pen   

原文地址:http://www.cnblogs.com/shenben/p/6395336.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!