一道秋招笔试算法题记录

发布时间 2023-08-25 21:12:07作者: 思wu邪

做股票的人总会忍不住幻想:如果知道明天怎样就好了。那么问题来了,如果打开上帝视角,你最好能做到怎样?
真实世界的股票交易规则太复杂,我们这里做一些简化。首先我们假设有N个股票和M个交易期。
可以认为在单个交易期内所有股票的价格都是恒定的。股票卖出需要缴纳交易额的P倍的印花税。股票可以零碎地买卖,即,你买个0.01股也是可以的。
我们这个市场里没有停牌,没有休市,没有涨停跌停,没有买空卖空,没有分红,而且股票价格也不会跌到零。

举个例子,假设你用手里的一元钱买了个股票。这个股票第一期价格1元/股,你买入之后手上有1股股票和0元现金。
这个股票在第二期涨到2元/股,那么你这时卖出1股就获得了2元(税前),扣除10%的印花税,你手上没有股票却有1.8元现金。

如果你在一开始有1元现金,在M个交易期之后,你最多能持有多少现金?

编程说明:
编译器版本: gcc 4.8.4
请使用标准输入输出(stdin,stdout) ;请把所有程序写在一个文件里,勿使用已禁用图形、文件、网络、系统相关的头文件和操作,如sys/stat.h , unistd.h , curl/curl.h , process.h

时间限制: 1S (C/C++以外的语言为: 3 S)
内存限制: 64M (C/C++以外的语言为: 576 M)

输入:
第一行是两个正整数N和M以及一个浮点数P。随后是M行,每行N个浮点数,代码某期(行)内某股票(列)的价格。

输出:
M期后你持有的现金,一个精确到小数点后一位的浮点数。

输入范例:
1 2 0.1
1
2

输出范例:
1.8

目前的答案,只能过80,希望得到指正。

#include <iostream>
#include <numeric>
#include <algorithm>
#include <cstdlib>
#include <map>
#include <ctime>
#include <vector>
#include <algorithm>
#include <stack>
#include <deque>
#include <queue>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <string>
#include <utility>
#include <memory>
#include <climits>
#include <cmath>
#include <sstream>
#include <iostream>
#include <string>
#include <iostream>
#include <numeric>
#include <algorithm>
#include <cstdlib>
#include <map>
#include <ctime>
#include <vector>
#include <algorithm>
#include <stack>
#include <deque>
#include <queue>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <string>
#include <utility>
#include <memory>
#include <iostream>
#include <string>

using namespace std;


int main(void)
{
	int N, M;
	double yinghuashui;
	cin >> N >> M >> yinghuashui;
	vector<vector<double>> vt(M, vector<double>(N, 0));  //day-gupiao
	vector< vector<double>> dp(M + 1, vector<double>(N+1, 0)); //dp[i][0] 第i天没有股票,dp[i][1]第i天持有股票1 的最多钱数或股票数
	
		for (int i = 0; i < M; ++i) {
			for (int j = 0; j < N; ++j) {
			cin >> vt[i][j];
		}
	}
	
	//for (auto& item1 : vt) {
	//	for (auto item2 : item1) {
	//		cout << item2 << " ";
	//	}cout << endl;
	//}
	//	cout << "---------" << endl;
	dp[0][0] = 1;
	for (int day = 1; day <= M; day++) {
		
		dp[day][0] = dp[day - 1][0];
		for (int gupiaoIndex = 1; gupiaoIndex <= N; ++gupiaoIndex) {
			double thisGthisPrice = vt[day - 1][gupiaoIndex - 1];
			dp[day][0] = max(dp[day][0] , dp[day-1][gupiaoIndex] * (1 - yinghuashui)* thisGthisPrice); //处理钱,前一天的股票卖出去
			
			
		}
		for (int gupiaoIndex = 1; gupiaoIndex <= N; ++gupiaoIndex) {
			double thisGthisPrice = vt[day - 1][gupiaoIndex - 1];
			dp[day][gupiaoIndex] = max({ dp[day][0] / thisGthisPrice,dp[day - 1][gupiaoIndex] });  //当天卖出,当天买入


		}
		
	}
	//for (auto& item1 : dp) {
	//	for (auto item2 : item1) {
	//		cout << item2 << " ";
	//	}cout << endl;
	//}
	printf("%0.1f", dp.back()[0]);
	return 0;
}