CSP-38th

发布于:2025-06-09 ⋅ 阅读:(12) ⋅ 点赞:(0)

目录

1.正态分布

2.走马

3.信息传输

4.字符串可能性个数

5.最多访问节点个数


1.正态分布

本来是很简单的一道模拟题,根据 (n-u) /a 的整数位、十分位确定是在第几行,根据百分位确定是在第几列,但是我直接将 (n-u)/a 乘以100后进行 // 和 % ,忽略了题目中说了 “a是100的因数” ,那么如果我不在第一时间 (n-u)* 100/a 的话会导致小数上的差异。

这个问题我检查了很久才发现,影响了做题节奏,所以还是要先看清楚题目意思,注意题目细节

2.走马

在棋盘上,一棋子从起点按照马的走法,走k步,请问能到的所有可能方块数

太久没做题了,我第一时间竟然发昏地用DFS,注意:这道题是有k步这个条件的,有些节点虽然在前面路径中了,已经add在vis里面,导致提前扼杀了这个点,但是有可能这个点在其他路径里面是较新点,如果你直接杀死他的话会导致他后面的可能性被忽略

虽然可以取消vis的剪纸,坚持add不会影响最后 len(vis) 的个数,但是这样的时间复杂度就过高了

所以像这种k步的想都不用想直接BFS即可

3.信息传输

这道题目就题面长度都有个五六页,真的看都不想看了

4.字符串可能性个数

确定了字符串长度n,中间参杂了m个 # 号,要求至少有一个 cff 字符串在另一个具体什么字符串我忘记了反正长为6

题目解析:# 号将这个长为 n 的空间分割为 m+1 段空间,要求其中要符合上面的要求,其他的随便26字符即可

那么先开个 l 数组,记录 m+1 段空间的长度,再根据长度 3 、6 、9(3+6) 进行挂标记 flag1、flag2、flag3

到时候我们需要实现的要求就是 至少有一个cff在长为6的字符串2左边,这个要求可以用 f2 存储,那么它需要的前置条件就是前面出现过 cff,这个用 f1 存

那么我们的 dfs 搜索树就是从字符串空间的左边到右边的,逐步实现 f1、f2

def dfs(step,now,f1,f2):
#step:当前所在字符串区间
#now:当前搜索路径上的字符串可能数
#f1:前面是否有字符串1
#f2:前面是否有字符串2

    if step==m+1:#总共m+1段
        if f2:
            ans=(ans+now)%MOD
        return

    zong=26**l[step]#总共可能数:每个位置都是26个字符

    if step in flag1:#从长度更长开始,因为长度越长可能性越多
        if f2:
            dfs(step+1,now*zong,1,1)
        else:
            if f1:#当前面有f1时可以凑f2
                now1=(l[step]-6+1)*26**(l[step]-6)
                dfs(step+1,now1,1,1)

                now2=zong-now1#也可以不凑,那么就是总可能减去上一个分支
                dfs(step+1,now2,1,0)
            else:
                '''
                后面的类似,主要是维护 f1 和 f2
                '''

5.最多访问节点个数

这个问题是一个图论,主要的大意如下:

有很多个浏览节点目标集,对于每个浏览节点目标集

        在所有节点中有一个节点会被损坏,现在对所有可能性进行求和,也就是 西格玛f(x) ,这里的x就是被损坏的节点

                而且我们的起点也是不固定的,所以要求的是最佳起点,使得上面的 f(x)和最大,也就是 f(x)=max{ f(x,y) } 其中x是断点,y是假设起点

#输入是双向路,到时候我们用链表结构串起来即可

def dfs(i,now):#i是断点
    for new in d[now]:
        if new==i:
            continue
        if new not in vis:
            vis.add(new)
            dfs(i,new)

for l in c:#目标节点集
    su=0
    for i in range(1,n+1):#需要求max
        ma=0
        for j in range(1,n+1):#需要求每个 y 时的值
            vis=set()
            if j!=i:
                vis.add(j)
            #执行bfs获取vis
            #然后判断vis中有多少在目标集中
            for li in l:
                if li in vis:
                    cnt+=1
        su+=cnt
    print(su)