2017年4月26日 阿里巴巴笔试编程题 股票

来源:互联网 发布:鸟哥linux私房菜基础篇 编辑:程序博客网 时间:2024/05/21 09:50

题目:



题目所给的代码:

#include <iostream>#include <vector>#include <cstdio>#include <algorithm>using namespace std;/*请完成下面这个函数,实现题目要求的功能*//*当然,你也可以不按照下面这个模板来作答,完全按照自己的想法来 ^-^ *//******************************开始写代码******************************/double StockGod(int n, int m, double p, const vector<vector<double>>& prices){}/******************************结束写代码******************************/int main(){    int n = 0;    int m = 0;    double p = 0;    cin >> n >> m >> p;    vector<vector<double>> prices;    for(int i = 0; i < m; ++i) {        prices.push_back(vector<double>());        for(int j = 0; j < n; ++j) {            double x = 0;            cin >> x;            prices.back().push_back(x);        }    }    double final = StockGod(n, m, p, prices);    printf("%.1f\n", final);        return 0;}

题目的意思是有n个股票,有m个交易期可以交易,问1元最多可以变成多少元

我刚开始的思路是,只选择1个股票,在每个交易期选择买入或者卖出,最后看最大收获是多少

代码:

double StockGod(int n, int m, double p, const vector<vector<double>>& prices){double ans = 1, a = 1, b = 1;for (int j = 0; j < n; j++){a = 1, b = 1;for (int i = 1; i < m; i++){if (prices[i][j] >= prices[i - 1][j])b *= prices[i][j] /prices[i - 1][j];else{if (b*(1 - p)>1)a *= b*(1 - p);b = 1;}}if (b*(1 - p)>1)a =a* b*(1 - p);if (ans < a)ans = a;}return  ans;}

通过率是60%

仔细一想,这个思路是不行的,比如下面的输入示例

2 3 0.1 

1 2 1 3 2 3

所以我新的思路是,手中的股票不一定一直是同一个股票,可以换,但是要保证手中永远只有一种股票(或者只有现金)

代码:

double StockGod(int n, int m, double p, const vector<vector<double>>& prices){int k = -1;double ans = 1-p, a = 1;for (int j = 0; j < n; j++)if (a < prices[1][j] / prices[0][j]){a = prices[1][j] / prices[0][j];k = j;}ans *= a;for (int i = 2; i < m; i++){a = 1;if (a < prices[i][k] / prices[i-1][k])a = prices[i][k] / prices[i-1][k];for (int j = 0; j < n; j++)if (a < prices[i][j] / prices[i-1][j]*(1-p)){a = prices[i][j] / prices[i-1][j] * (1 - p);k = j;}ans *= a;}return  ans>1?ans:1;}

通过率还是60%

我感觉正确的解答应该是动态规划,但是没想出来怎么实现。

0 0