2 条题解

  • 1
    @ 2025-7-4 16:36:30

    一个比楼下还要好想的贪心,连脑子是什么都不知道

    注意到股市的变化趋势是一定是若干个交替出现,O(n)O(n)刷一遍,谷就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
      @ 2025-7-4 14:12:45

      一个非常好想的dp,脑子都不用动一下

      每一个时刻拥有的钱和股票肯定越多越好!

      所以设 f[i][0] 为 第 ii 天最多的股票,f[i][1] 为 第 ii 天最多的钱,

      显然,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
      上传者