这次比赛的题目难度又降低不少,基本上都是出现过的经典老题,最后一题更是曾多次出现在CSDN的每日一练中,看来官方是想提醒大家多多参与每日一练啊。


第一题:小艺读书

书是人类进步的阶梯。 小艺每周因为工作的原因会选择性的每天多读几页或者少读几页。

小艺想知道一本n页的书她会在周几读完。

分析

一开始以为是老题——给定n页的书,每天读3页或4页,然后想在某一天读完,有多少种读法。仔细一读,发现变得更简单了:题目给出了一个包含7个元素的列表,表示每天读多少页。然后题目就可以通过不断用总页数 n 减去每天读书的页数,直到 n 等于或小于0为止,即可得到需要读多少天。

唯一需要注意的是当读书的天数超过一周时,结果大于等于7,需要重新变成0开始。这也很简单,只要对7取余即可。该题简单到连结果都不需要转化为星期几,直接返回0到6的数字即可。

参考代码

def solution(n, pages):result = 0while n>0:n -= pages[result%7]result += 1return result%7

第二题:鬼画符门之宗门大比拼

给定整数序列A。求在整数序列A中连续权值最大的子序列的权值。

分析

题目标题起得很唬人,其实也是经典老题:求整数序列中连续子序列之和的最大值,LC原题。前几天在CSDN问答频道也有人问过,问哥还回答过,可惜没有被采纳。

解法有很多种,暴力解法也可,就是把所有的子序列求出来,然后比较它们的和,返回最大值。不过这种解法有可能因为耗时太长而无法通过测试,问哥也没有尝试。

时间复杂度为O(n)的解法是使用贪心算法或动态规划。算法的核心思想是:对序列中每一个整数而言,如果之前的序列之和是负数,就不相加。因为如果加上之前的序列,反而比自己本身的值还要小,而我们要找最大值,显然不符合,所以最大子序列应该从自己开始算起。

所以,额外定义两个变量,一个用来记录连续相加的子序列之和,一个用来记录最大的子序列之和。使用 max() 函数即可完成比较。当for循环遍历完一遍列表,即可返回结果。

唯一要注意的一点是,两个变量在初始化的时候,不需要表示“极小值”,而是直接赋值列表的第一个元素即可。这样可以假定列表只有一个元素,那么最大子序列当然就是第一个元素。然后遍历的时候从第二个元素开始比较。

参考代码

def solution(n, arr):result = temp = arr[0]for i in arr[1:]:temp = max(i, i+temp)result = max(result, temp)return result

第三题:硬币划分

有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱(n<=100000),有多少中组合可以组成n分钱?

分析

四道题里稍微有点难度的,但也是老题。首先常识告诉我们,用暴力的穷举法一定能做出来。无非是四层嵌套循环abcd,分别表示1分、2分、5分、10分四种硬币,然后当下面等式成立的时候,结果加一:

时间复杂度为 。因为这种方法太直观了,问哥一上来就试过,果不其然,无法通过。

该使用万能的动态规划了。

这里需要在逻辑上稍微理一理。我们要使用1、2、5、10分四种硬币得到n,那这个可能的方法数量可以由什么(状态)推导而来呢?我们用f(n)表示使用四种硬币组成价值n的方法数,在可能的结果里先拿走一枚10分的硬币(假设n>=10),那么剩下的硬币总价值为n-10。相对应地,f(n-10)表示使用这四种硬币有多少种方法可以组合成 n-10。假设规定最后这10分的价值只允许使用10分的硬币,那很显然,f(n)=f(n-10)。但是这10分、乃至价值n都同样可以使用1、2、5硬币来得到,所以我们要加上如果只使用1、2、5分硬币组成n的方法数,用f'(n)表示的话可以得到以下公式:

不难发现,如果我们在f'(n)里拿走5分硬币,用f''(n)表示只使用1、2两种硬币得到n的方法数,同样可以推导出

为了使表达更清楚,我们更换一下f的表示方法,可得以下公式:

其中分别代表:只使用1分2分硬币、只使用1分2分5分硬币、使用全部4种硬币得到价值 n 的方法数。而,也就是只使用1分硬币的情况,方法数必然恒定是1,所以无须推导。

你可能会有一种“错觉”:这样会不会漏掉一些可能,比如那种“在前面使用了四种硬币,而在最后10分的时候只使用了1、2、5分硬币”?其实不然,这种情况必然已经包含在了公式的计算结果里,因为硬币是没有使用顺序的,你可以假设拿走的那一枚10分的硬币,是存在于“前面使用了四种硬币”里的某一枚(总的10分硬币的数量相同),这样,该情况就必然包含在了结果里。

根据上述推导,我们可以列出动态规划图表如下:

价值(n) 0 1 2 3 4 5 6 7 8 9 10 11 12 13
只使用1分硬币( 1 1 1 1 1 1 1 1 1 1 1 1 1 1
只使用1分、2分硬币( 1 1 2 2 3 3 4 4 5 5 6 6 7 7
只使用1分、2分、5分硬币( 1 1 2 2 3 4 5 6 7 8 10 11 13 14
使用全部四种硬币( 1 1 2 2 3 4 5 6 7 8 11 12 15 16

最终我们要返回的结果就是图表的右下角数字,如果列出二维数组的话,也就是dp[3][n]。

参考代码

def solution(n):result = [[1]*(n+1) for i in range(4)]for i in range(2,n+1):k = 1for j in [2,5,10]:if i>=j:result[k][i] = result[k][i-j]+result[k-1][i]else:result[k][i] = result[k-1][i]k += 1return int(result[3][n]%(1e9+7))

该题因为要考虑到传统编程语言可能会存在得出的结果太大,产生数据溢出的问题,从而要求得到的结果对1000000007取模。所以,在返回的时候要将得到的结果进行模运算。


第四题:饿龙咆哮-逃离城堡

小艺酱误入龙族结界,被恶龙带回城堡,小艺酱决定逃离城堡,逃离龙族结界.。

总路程为c, 小艺酱的速度是vp,饿龙速度为vd。饿龙会在t小时后发现小艺酱出逃。

小艺酱担心自己跑不出去,准备了好多珍宝。 每当饿龙追上自己的时候小艺酱就会丢下一个珍宝,饿龙捡到珍宝会返回自 己的城堡进行研究,研究f小时后,再出城堡追赶小艺。

小艺想知道自己至少需要丢多少珍宝才能让自己安全逃出结界。

分析

CSDN每日一练里的题目,也是数学里再熟悉不过的追赶题——速度快的追速度慢的,问两人(物)相遇的时候,速度快的跑了多少路。因为每次饿龙捡到珍宝后,都要退回城堡再出发,于是本题就可以转化为,小艺要丢几次珍宝,才使得最后一次饿龙追不上小艺。而每次追赶的时候,小艺都先跑了 t 时间的路,所以 vp*t 就是每次追赶时的初始距离,设 x 为饿龙追上小艺所花的时间,易得 ,而vd*x 则等于饿龙追上小艺时跑的路程,于是可得,当最后一次追赶 大于结界总路程 c 的时候,代表饿龙追不上,而小艺成功逃出结界。

参考代码

def solution(vp, vd, t, f, c):result = 0if vd<=vp: return 0x = vp*t/(vd-vp)while vd*x<c:result += 1t += 2*x+fx = vp*t/(vd-vp)return result

虽然看起来似乎是官方在号召大家多多参加CSDN的每日一练,但问哥不得不吐槽,每日一练中的题目真的是文字描述问题太多,常常让人看不懂,而且测试数据也存在问题。问哥已经亲身遇到过其他平台的真题在CSDN无法通过测试。只希望官方能够重视起来,尽快对在线答题系统进行优化吧。

Python解题 - CSDN周赛第9期相关推荐

  1. Python解题 - CSDN周赛第36期

    本期有点难度,系统也没有多少bug,算是最近 N 期周赛里质量较高的一期比赛了. 第一题:查找点在自然区间的坐标 定义:实数轴上的一个区间由左右两个端点,假设区间是左闭右开的,例如区间`[0,1)`. ...

  2. Python解题 - CSDN周赛第25期 - 水池注水

    本期四道题都是在每日一练出现过多次的老题,而且后两道题的思维难度颇大,尤其最后一题-水池注水,如果没有提前准备过,问哥是万万不可能在两个小时内做出来的.所以,拿到这个名次,问哥心里其实很虚.提交之后发 ...

  3. Python解题 - CSDN周赛第23期 - 树形背包与优化

    以问哥目前的水平来看,本期的四道题的整体难度还是中等偏上的,而且从结果上来看, 也达到了竞赛的标准(只有三名选手拿到满分).也许在某些大佬看来还是太简单了,毕竟都是模板题,直接套模板就能过,但对于这些 ...

  4. Python解题 - CSDN周赛第29期 - 争抢糖豆

    本期问哥是志在必得,这本算法书我已经觊觎许久,而之前两次因为种种原因未能如愿.因此,问哥这几天花了不少时间,把所有之前在每日一练做过的题目重新梳理了一遍.苦心人,天不负,感谢官方大大! 第一题:订班服 ...

  5. Python解题 - CSDN周赛第32期 - 运输石油(三维背包)

    上期周赛因为最后一题出现bug,再加上都是经典的模板题,问哥就懒得写题解了. 本期也是有两道考过的题目,不过最后一题因为考到了背包问题的特殊类型,还是值得拿出来记个笔记. 第一题:传奇霸业 传奇霸业, ...

  6. Python解题 - CSDN周赛第40期

    上期问哥没参加,但从赛后大家的反馈来看,又出现了数据上的bug,使用 python 的朋友会遇到第二个用例的柱子高度数组长度不够,200根柱子,只有179个数据,这让人怎么玩?但是用C++的选手就没有 ...

  7. CSDN周赛第30期题目解析(天然气定单、小艺读书、买苹果、圆桌)

    CSDN周赛第30期,我应试成绩"0"分.试着对天然气定单.小艺读书.买苹果

  8. CSDN周赛第39期:赢签名实体书和图书《从零开始学算法(基于Python)》

    本场竞赛由「电子工业出版社 & CSDN」联合主办. 一.报名方式 第39期周赛报名地址,3月22日 19点开考(周三):https://edu.csdn.net/contest/detail ...

  9. 【CSDN周赛第38期】Python题解

    这次题目不怎么难,基本上都在周赛中出现过,python代码附上. 一.代谢写匿名信 这个没有全过,有一个没过,得分率9/10,检查的时候反过来检查刚刚好检查到这里就没检查了就没发现.所以不知道是什么情 ...

  10. CSDN周赛第32期:赢图书《金融级IT架构:数字银行的云原生架构解密》 和定制周边

    一.报名地址 第32期周赛报名地址,2月26日 9点开考(周日):https://edu.csdn.net/contest/detail/46 第33期周赛也在报名中,3月1日 19点开考(周三):h ...

最新文章

  1. php sendmail方法,PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法
  2. python launcher怎么使用_python的launcher用法知识点总结
  3. 视觉检索:视频多帧排序
  4. 关于extern C
  5. 与afreez一起学习DSP中浮点转定点运算--浮点数的存储格式
  6. java形参、实参、值传递、引用传递
  7. AE光效插件Optical Flares for Mac出现不显示预览缩略图,如何解决
  8. Strusts2笔记6--拦截器
  9. 支付宝APP支付功能开发
  10. PROFINET非周期读写分析笔记
  11. 一台计算机可以安装网络打印机和本地打印机,您在计算机上安装一台本地打印机。您共享这台打印机。您需要确保只有名为Grou - 问答库...
  12. ps时间轴制作渐隐动态签名
  13. vue中echarts实现甘特图
  14. python+windows画图工具--复现别人论文中的colormap 方法2
  15. 【pip】raise MaxRetryError(_pool, url, error or ResponseError(cause))
  16. selenium实现后台24小时平均温、全国降水量自动上传工作
  17. STA(静态时序分析) 详解:如何计算最大时钟频率,以及判断电路是否出现时钟违例(timing violation)?
  18. 子网掩码必须是相邻的是什么意思_零基础IP子网划分详解
  19. 轻文章-维修2台IBM服务器
  20. OOA\OOP\OOD

热门文章

  1. (3)二进制文件方式部署Kubernetes高可用集群----------创建TLS证书和秘钥
  2. Highways POJ-1751 最小生成树 Prim算法
  3. avalon调试接口的弹出
  4. 解决 webpack-dev-server 不能自动刷新的问题
  5. 微信开发-点击链接自己主动加入关注
  6. SQL Server2012新特性
  7. IOS开发笔记_5.线程,HTTP请求,定时器
  8. opencv的Mat中step
  9. NavicatPremium-Mac-无法打开问题
  10. CSS 画一条横线/竖线