Python解题 - CSDN周赛第9期
这次比赛的题目难度又降低不少,基本上都是出现过的经典老题,最后一题更是曾多次出现在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期相关推荐
- Python解题 - CSDN周赛第36期
本期有点难度,系统也没有多少bug,算是最近 N 期周赛里质量较高的一期比赛了. 第一题:查找点在自然区间的坐标 定义:实数轴上的一个区间由左右两个端点,假设区间是左闭右开的,例如区间`[0,1)`. ...
- Python解题 - CSDN周赛第25期 - 水池注水
本期四道题都是在每日一练出现过多次的老题,而且后两道题的思维难度颇大,尤其最后一题-水池注水,如果没有提前准备过,问哥是万万不可能在两个小时内做出来的.所以,拿到这个名次,问哥心里其实很虚.提交之后发 ...
- Python解题 - CSDN周赛第23期 - 树形背包与优化
以问哥目前的水平来看,本期的四道题的整体难度还是中等偏上的,而且从结果上来看, 也达到了竞赛的标准(只有三名选手拿到满分).也许在某些大佬看来还是太简单了,毕竟都是模板题,直接套模板就能过,但对于这些 ...
- Python解题 - CSDN周赛第29期 - 争抢糖豆
本期问哥是志在必得,这本算法书我已经觊觎许久,而之前两次因为种种原因未能如愿.因此,问哥这几天花了不少时间,把所有之前在每日一练做过的题目重新梳理了一遍.苦心人,天不负,感谢官方大大! 第一题:订班服 ...
- Python解题 - CSDN周赛第32期 - 运输石油(三维背包)
上期周赛因为最后一题出现bug,再加上都是经典的模板题,问哥就懒得写题解了. 本期也是有两道考过的题目,不过最后一题因为考到了背包问题的特殊类型,还是值得拿出来记个笔记. 第一题:传奇霸业 传奇霸业, ...
- Python解题 - CSDN周赛第40期
上期问哥没参加,但从赛后大家的反馈来看,又出现了数据上的bug,使用 python 的朋友会遇到第二个用例的柱子高度数组长度不够,200根柱子,只有179个数据,这让人怎么玩?但是用C++的选手就没有 ...
- CSDN周赛第30期题目解析(天然气定单、小艺读书、买苹果、圆桌)
CSDN周赛第30期,我应试成绩"0"分.试着对天然气定单.小艺读书.买苹果
- CSDN周赛第39期:赢签名实体书和图书《从零开始学算法(基于Python)》
本场竞赛由「电子工业出版社 & CSDN」联合主办. 一.报名方式 第39期周赛报名地址,3月22日 19点开考(周三):https://edu.csdn.net/contest/detail ...
- 【CSDN周赛第38期】Python题解
这次题目不怎么难,基本上都在周赛中出现过,python代码附上. 一.代谢写匿名信 这个没有全过,有一个没过,得分率9/10,检查的时候反过来检查刚刚好检查到这里就没检查了就没发现.所以不知道是什么情 ...
- CSDN周赛第32期:赢图书《金融级IT架构:数字银行的云原生架构解密》 和定制周边
一.报名地址 第32期周赛报名地址,2月26日 9点开考(周日):https://edu.csdn.net/contest/detail/46 第33期周赛也在报名中,3月1日 19点开考(周三):h ...
最新文章
- php sendmail方法,PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法
- python launcher怎么使用_python的launcher用法知识点总结
- 视觉检索:视频多帧排序
- 关于extern C
- 与afreez一起学习DSP中浮点转定点运算--浮点数的存储格式
- java形参、实参、值传递、引用传递
- AE光效插件Optical Flares for Mac出现不显示预览缩略图,如何解决
- Strusts2笔记6--拦截器
- 支付宝APP支付功能开发
- PROFINET非周期读写分析笔记
- 一台计算机可以安装网络打印机和本地打印机,您在计算机上安装一台本地打印机。您共享这台打印机。您需要确保只有名为Grou - 问答库...
- ps时间轴制作渐隐动态签名
- vue中echarts实现甘特图
- python+windows画图工具--复现别人论文中的colormap 方法2
- 【pip】raise MaxRetryError(_pool, url, error or ResponseError(cause))
- selenium实现后台24小时平均温、全国降水量自动上传工作
- STA(静态时序分析) 详解:如何计算最大时钟频率,以及判断电路是否出现时钟违例(timing violation)?
- 子网掩码必须是相邻的是什么意思_零基础IP子网划分详解
- 轻文章-维修2台IBM服务器
- OOA\OOP\OOD