【竞赛经历】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 *5min( (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)

猜你喜欢

转载自blog.csdn.net/ZHOU_YONG915/article/details/129824691