2 条题解
-
1
一个比楼下还要好想的贪心,连脑子是什么都不知道
注意到股市的变化趋势是一定是若干个峰和谷交替出现,刷一遍,谷就all in,峰就all out,哈哈,赚麻了。
于是就有了一个你一定可以比我写的更简洁的代码:
#include<bits/stdc++.h> #define int long long using namespace std; const int N=1e5+10; double a[N],money=1; int gu[N],n,tot; signed main(){ cin>>n; for(int i=1;i<=n;i++){ double x; cin>>x; if(x==a[tot])continue;//去了一下重,也可以unique a[++tot]=x; } n=tot; for(int i=1;i<=n;i++){ if(i==1||i==n)continue; if(a[i]>a[i-1]&&a[i]>a[i+1])gu[i]=1; if(a[i]<a[i-1]&&a[i]<a[i+1])gu[i]=-1; } for(int i=1;i<=n;i++)if(gu[i]){if(gu[i]==1)gu[1]=-1;break;} for(int i=n;i>=1;i--)if(gu[i]){if(gu[i]==-1)gu[n]=1;break;} for(int i=1;i<=n;i++){ if(gu[i]==-1)money/=a[i]; if(gu[i]==1)money*=a[i]; } cout<<fixed<<setprecision(1)<<money; return 0; } -
-2
一个非常好想的dp,脑子都不用动一下
每一个时刻拥有的钱和股票肯定越多越好!
所以设
f[i][0]为 第 天最多的股票,f[i][1]为 第 天最多的钱,显然,
f[0][0]=0, f[0][1]=1考虑到有可以买卖和什么都不干,于是有:
f[i][0] = max(f[i-1][0], f[i-1][1]/a[i])这是买股票f[i][1] = max(f[i-1][1], f[i-1][0]*a[i])这是卖股票于是有一个能过的代码:
#include<iostream> #include<cstdio> using namespace std; int n; double a,f[100005][2]; int main(){ scanf("%d",&n); f[0][0]=0; f[0][1]=1; for (int i=1;i<=n;i++){ scanf("%lf",&a); f[i][0]=max(f[i-1][0], f[i-1][1]/a) f[i][1]=max(f[i-1][1], f[i-1][0]*a) } printf("%.1lf",f[n][1]); return 0; }可以用滚动数组优化,有:
#include<iostream> #include<cstdio> using namespace std; int n; double a,f[2][2]; int main(){ scanf("%d",&n); f[0][0]=0; f[0][1]=1; for (int i=1;i<=n;i++){ scanf("%lf",&a); f[i&1][0]=max(f[(i&1)^1][0], f[(i&1)^1][1]/a); f[i&1][1]=max(f[(i&1)^1][1], f[(i&1)^1][0]*a); } printf("%.1lf",f[n&1][1]); return 0; }更快了
- 1
信息
- ID
- 310
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- (无)
- 递交数
- 15
- 已通过
- 10
- 上传者