【竞赛经历】CSDN第40期竞赛题解
1 前言
第二次参赛,一开始感觉做得稀烂,很多知识点不记得了,但是搞完意外发现还拿了第9,hhhhh。。。
个人水平有限,这里只写我做出来的前两道,其他题建议参考大佬们的文章,比如这个
2 部分题解
第一题:小鱼的航程(改进版)
有一只小鱼,它上午游泳150公里,下午游泳100公里,晚上和周末都休息(实行双休日),假设从周x(1<=x<=7)开始算起,请问这样过了n天以后,小鱼一共累计游泳了多少公里呢?
分析
此题是一道模拟题。
n天分为三部分:开始的周x到第一个周日、完整的几个周、最后一个周一到最后一天。
设第一部分的天数a=8-x
,则三部分的工作日天数分别为:max( 0, a-2 )
,(n-a) //7 *5
,min( (n-a) %7, 5 )
。
三项相加得到总工作日天数,乘以250即为答案。
代码
x, n = map (int, input().split())
a = 8-x
r = max( 0, a-2 ) + (n-a) //7 *5 + min( (n-a) %7, 5 )
print (r *250)
第二题:编码
编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数字。字母表中共有26个字母{a,b,…,z},这些特殊的单词长度不超过6且字母按升序排列。把所有这样的长度相同的单词放在一起,按字典顺序排列,一个单词的编码就对应着它在整个序列中的位置。你的任务就是对于所给的单词,求出它的编码。
分析
此题是一道动态规划题。
构造一个函数func (start, length)
,表示以字母start开始的、长度为length的、满足严格递增要求的字符串的个数。
最终结果可由func表示,例如字符串"ce"
的编码就是( func("a",2) + func("b",2) ) + ( func("a",1) + func("b",1) + func("c",1) + func("d",1) )
。
而func的具体内容是:若length为1,则显然只有一个就是start本身;否则个数可由length-1的func递归求出,例如func("x",3) == func("y",2) + func("z",2)
。
最后别忘了判断是否严格递增,不满足就输出0。
此题的时间限制较松,虽然是动态规划,但只写成递归也能通过。
代码
word = [ ord(c)-ord("a")+1 for c in input() ]
isvalid = all( word[i+1] > word[i] for i in range(len(word)-1) )
def func (start, length):
if length==1: return 1
else: return sum( func (s, length-1) for s in range (start+1, 27-length+1) )
rslt = 0
for idx, char in enumerate(word):
rslt += sum( func (c, len(word)-idx) for c in range (0, char) )
print (rslt if isvalid else 0)