股神小L 2016Vijos省选集训 day1
2017-02-13 20:53
417 查看
股神小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
============================
小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 ; 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 ,f ; 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 [i]); printf("%d",ans); return 0; } */
相关文章推荐
- 【BZOJ】2734: [HNOI2012]集合选数
- Two Sum III - Data Structure Design
- 关于 UGUI 字体花屏或乱码
- 日期相关---SimpleDateFormat的setLenient(true/false)-----自动计算日期
- python中*args **kw
- cf 662C Binary Table
- SVN服务的搭建和使用
- Java EL 详细用法讲解
- pjmedia高级API实现放音
- POJ 1789 Truck History (最小生成树)
- JVM内存模型及垃圾回收算法
- 【游戏设计模式】之 《游戏编程模式》全书内容提炼总结
- 基于ASP.NET Core Data Protection生成验证token
- 简单谈谈JavaScript中的this
- hdoj1089
- 苹果问题
- 正则表达式学习笔记
- Piwik安装所遇问题及解决方法
- 分页工具类源码
- The Knowledge of Linux-.-Day07