考试反思 2019-08-06

34 篇文章 0 订阅
23 篇文章 0 订阅
T1:S先生与Q小姐
题目大意

S先生有一种超能力,让他可以预测出股票的价格,他打算用这个超能力大干一场
S先生知道n天内的股票价格,在第i天时他有如下操作:
1.不动,不买也不卖
2.卖掉股票,收获a[i]的价格
3.买进股票,减少a[i]的价格
已知他每天只能如上操作一次,请问他最大可以获得多少价格买东西取悦美丽的Q小姐呢???

Input

第一行为股票的个数n
第二行有n个数,表示每一个股票的价格

Output

每个区间内不并存的勾股数

Sample Input

20
3 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 2 3 8 4

Sample Output

41

第一印象:这道题的样例竟然是斐波那契数列。。。2333不过这组样例很难推,推了半天才推出来,推完后发现正解应该是DP,然而状态转移方程硬是推不出来,于是还是转为了暴力DFS(话说最近DFS用了好几遍了。。。),此外,我还稍微考虑了一下当股票的价格为负数会怎样,发现无需考虑。

思路:暴力搜索,定义状态dfs(day,value,stock),意为第day天的总价格为value且此时有stock张股票(虽然题目没说,但股票数量可以大于等于1),dfs伪代码如下:

dfs(day+1,value,stock);//这一天什么都没有发生
if(stock>=1)//当前手上有股票可卖
	dfs(day+1,value+a[day+1],stock-1);//卖掉这份股票,股票总数减一
dfs(day+1,value-a[day+1],stock+1);//买入这份股票

我自己的剪枝技巧(不知道对不对):

if(day>int(n/2)&&value<0)//如果都过了一半的天数了价格还小于0,基本没救了(注意是基本,有可能会被毒瘤数据卡过,但可以大大降低时间复杂度)
	return ;
if(day==n+1)//总天数走完了自动退出
	return ;

最后每次求出最大值就可以啦!!!

错误原因:
1.题目不一定是在最后一个点取最大,应该每一个dfs中优先判断一下最大值。
2.该算法时间复杂度太大,超时了很多,不过我的剪枝技巧是对的,但整个算法还是有点过于暴力,正解应该是用DP,不过DP也得优化为n*log(n)的时间复杂度,不能用n^2的算法,

正确算法:DPor小根堆(记得开long long)
反思:
1.对于一道题目,不妨手推一下样例,推样例的过程其实就相当于你在模拟一遍自己的算法,发现推不出的地方,有问题的地方,其实就相当与你的程序中可能出现的错误,通过推样例也可以进行调整。
2.题目描述很有可能不全面,我们应该正确对待,理智处理仔细观察数据测试点和范围,想一想程序中会存在很多漏洞。(如该题就没有说股票存储的数量可以大于等于1)
3.注重自己的时间复杂度,在满足正确性的同时尽量满足时间条件。(如该题我用了可能错误的算法剪枝,降低了许多时间复杂度)
4.读懂题目意思很关键,如该题我一开始就误认为最多可以持有一份股票,但仔细读题后发现并不是这样的。
5.有的时候,当你想不出完美算法时,或算法缺少验证数据时,可以通过DFS写出暴力程序,在进行对拍。
6.十年OI一场空,不开long long见祖宗(开long long时如果用scanf输入要将%d改为%lld)
7.我们可以运用许多方法来优化我们的程序。如该题要拿100分必须要用小根堆进行优化
8.我们要把数据点想象得很坑,有助于我们考虑多种情况,从而拿到更高的分

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值