以后几天主要刷入门组原来不会的题。
第一题:1036
原来代码:
可以看出红框里的代码全部没有审清题意。
今天看了dgc的代码,发现循环只需要从3循环到n-1,而且根本没必要把上车人数、下车人数、当前人数全部记录下来,更不需要编写一个函数做这项工作。
后来我再提交的时候错误一个点,最后发现b的循环需要从0开始。
今天发现入门组的题目都没有我想的那么复杂,看问题有时需要看简单一点儿,这样可以使思路更明确,做题速度也会加快。
同时做题提交后发现错误时,应该再读一遍题目,并改进代码,绝对不能放弃。
AC代码:
第二题:1041
原来代码:
这道题可以说是递归中最简单的题目之一了,但是当时还是错了。当时有两处思路错误:
①既然每个状态只与前一个状态有关,而且用过一遍以后再也不会用了,就只需要用一个变量记录上一个状态,不需要开数组,浪费了空间(这并不主要)
②循环边界条件有误:第一个循环应该是for(int i=1; i<=n-p; i++),第二个则应该是for(int i=n-p+1; i<=n; i++)。造成这个错误的原因是没有看清题目:“有m刀没有经过中间点”被我看成了“有m刀经过中间点”。
看了lijunhui的代码才发现自己犯了这样可笑的错误。
AC代码:
另一种以公式形式解的AC代码:
其中核心语句中2*(n-m)指经过中间点的切法分成的份数,再加上(2*n-m+1)*m/2,也就是从n开始倒着往后数m个数的和(即不经过中间点的切法每刀能够形成的交点数之和,与高斯求和差不多)。
第三题(也是最后一题):1042
原来代码:
像这样的暴力解法,时间超限也是正常的。
这道题本身有一定难度,看了sunxiyue的代码后,刚开始没理解,考虑了几分钟之后才发现每行代码的意思,这么高深、快捷、实用的代码我是想不出来的。
后来因为这份代码里有许多细节问题,所以提交了好几次都没能通过,不过最后还是自己写对了。
AC代码:
在今天完成的3道题中,这道题是给我收获最大的,而这道题也是唯一一道让我收获了更好思路的题目。