11届国赛python试题 J: 蓝跳跳

Python017

11届国赛python试题 J: 蓝跳跳,第1张

【问题描述】

小蓝制作了一个机器人,取名为蓝跳跳,因为这个机器人走路的时候基本靠跳跃。

蓝跳跳可以跳着走,也可以掉头。蓝跳跳每步跳的距离都必须是整数,每步可以跳不超过 k 的长度。由于蓝跳跳的平衡性设计得不太好,如果连续两次都是跳跃,而且两次跳跃的距离都至少是 p,则蓝跳跳会摔倒,这是小蓝不愿意看到的。

小蓝接到一个特别的任务,要在一个长为 L 舞台上展示蓝跳跳。小蓝要控制蓝跳跳从舞台的左边走到右边,然后掉头,然后从右边走到左边,然后掉头,然后再从左边走到右边,然后掉头,再从右边走到左边,然后掉头,如此往复。为了让观者不至于太无趣,小蓝决定让蓝跳跳每次用不同的方式来走。小蓝将蓝跳跳每一步跳的距离记录下来,按顺序排成一列,显然这一列数每个都不超过 k 且和是 L。这样走一趟就会出来一列数。如果两列数的长度不同,或者两列数中存在一个位置数值不同,就认为是不同的方案。

请问蓝跳跳在不摔倒的前提下,有多少种不同的方案从舞台一边走到另一边。

【输入格式】

输入一行包含三个整数 k, p, L。

【输出格式】

输出一个整数,表示答案。答案可能很大,请输出答案除以 20201114 的余数。

【样例输入】

3 2 5

【样例输出】

9

【样例说明】

蓝跳跳有以下 9 种跳法:

1+1+1+1+1

1+1+1+2

1+1+2+1

1+2+1+1

2+1+1+1

2+1+2

1+1+3

1+3+1

3+1+1

【样例输入】

5 3 10

【样例输出】

397

这种题可以用递归的DFS解也可以用动态规划,相比较经典的递归走台阶问题,由于题目没有限定第一步跳的种类,所有导致有多种方法。递归之后也是无法求解递归无法求解的题目。因为重复计算。计算规模o(L的k次方),所以采用了动态规划+递推做的此题,我们可以建立一个2维数组dp[i][j] 。

i 表示舞台距离,j表示第一次跳j格时。 dp[i][j]表示我当前步数用j步走 可以多少种方法走到i。

p意思就是连续跳大于等于p时就会摔倒。

d[i][j]i跳数的取值范围0-K

j的取值范围是0-L

规律描述:当舞台长度为1时,我第一步为1时dp[1][1]=1 种方法 当第一步为2时 d[1][2]=0种。当第一步为3时dp[1][3]=0种。

当舞台长度为2时,我第一步为1时dp[2][1]=1种方法 当第一步为2时dp[2][2]=1种。当第一步为3时dp[2][3]=0种.

当我们得到长度为2 第一步为1时, 我当前的长度减1 剩余舞台长度为1,我们可以看到舞台为1的时候一共只有1种方法那么当长度为dp[1][1]+dp[1][2]+dp[1][3]=dp[2][1]=1 第一步为1时就是一种方法。因为当跳的步数和长度相等的时候只有一种方法 dp[2][2]=1。

如果连续两次都是跳跃,而且两次跳跃的距离都至少是 p,我们知道j是第一种跳法,k就是第2个选择的跳法所以 j>=b 分为二种转移方程,

当j>=b , 说明我们第一次跳了大于p的距离如果我们第二次在大于p那么蓝跳跳将会摔倒所以我们dp[4][2]+=dp[2][1] 不可以选择dp[2][2]和dp[2][3]

那么转移方程得:dp[i][j]+=dp[i-j][k]

当第一次小于p的长度,我们第二次就把所有可能选择上dp[4][1]=dp[3][1]+dp[3][2]+dp[3][3]

那么转移方程得:dp[i][j]+=sum(dp[i-j])。

但是这种不是最优解最多跑80%的数据。

创建一个双层的循环数组,0层存j<b的方式个数,1层存b<p+1方式个数。和上面方法差不多只不过是以双层的格式存储,这样可以少很多的计算量。

我们先把已知的数据写入二维数据中dp[1][0]=1,然后遍历2,s+1和1,p+1,因为当s=0时 方法只有一种。把dp[0][1]=1 或者dp[0][0]=1 我只是把这个当上面方法dp[i][j]+=1用了。

这个转移方程也是2个,一个 (1,b) 和(b,p+1) 把j<b 存在dp[i][0] b<p+1存在dp[i][1]。

转移方程分别为 dp[i][0]+=dp[i-j][1]+dp[i-j][0], dp[i][1]+=dp[i-j][0]。

这种就可以把数据跑完了计算量把上个方法少了很多。

1、average_sum函数的功能为求一批数中大于平均值sum=0k=0for i in range(n): sum=sum+a[i]average=sum/nfor i in range: if(a[i]>average):k=k+a[i]return k2、编写函数fun求一个不多于五位数的正整数的位数if(m>9999): place=5elif(m>999): place=4elif(m>99): place=3elif(m>9): place=2else: place=1return place3、请编fun函数,求4*4整形数组的主对角线元素的和sum=0.0for i in range(4): sum+=a[i][i]return sum4、已知:一元钱一瓶汽水,喝完后两个空瓶换一瓶汽水。问:请输入钱数(大于1的正整数),则根据钱数最多可以喝到几瓶汽水。s=0k=0while m>0: m=m-1 s=s+1 k=k+1 while k>=2:k=k-2s=s+1k=k+1return s5、编写函数fun(x,y),函数的功能是若x、y为奇数,求x到y之间的奇数和;若x、y为偶数,则求x到y之间的偶数和。要求必须使用for结构。 主函数的功能是分别计算如下的值: (1+3+5+……+777)+(2+4+6+……+888)=??? (1+3+5+……+1111)+(2+4+6+……+2222)=???(1+3+5+……+1999)+(2+4+6+……+1998)=???s=0for i in range(x,y+1,2): s=s+ireturn s6、编写函数main 求3!+6!+9!+12!+15!+18!+21!s=0for i in range(3,22,3): r=1 for j in range(1,i+1):r*=j s+=rprint(s)

这是一位有着五年 Python 经验的好友最近对 Python 岗位面试后的一篇经验总结,从 Python 就业方向到 Python 面试题。

Python 就业方向

下面是 Python 面试知识点,总结了华为、阿里巴巴等互联网公司 Python 常问面试题。每道题都提供参考答案,希望能够帮助你在求职面试中脱颖而出,找到一份高薪工作。

这些面试题分为 Python 基础和 Python高级,内容包含: 基础语法、文件操作、模块与包、数据类型、元类、内存管理与垃圾回收机制以及 Python 函数 等知识点。

(一) Python 基础语法

(二) 文件操作

(三) 模块与包

(四) 数据类型

(五)企业面试题

(一) 元类

(二)内存管理与垃圾回收机制

(三)函数

(四) 面向对象

由于篇幅有限,这份 Python 面试宝典已经被整理成了PDF文档,有需要 Python 面试宝典全套完整文档(面试题+答案解析)的可以 免费领取!