csust第六次周赛题解全集

难度定义(个人) D<B<A<E<<C
传送门题目链接
D题解:
简单的思维题,自己观察一下n=1到n=5基本上可以发现规律 (没发现就打表看看吧
si =s(i-1) +s(i-1)反
那么继续观察下 两串衔接处的规律 要么是11 要么是01
然后递推,愉快AC

B题解:dp[i]初始化i出现的次数 转移方程dp[i]=max(dp[i-1],dp[i-2]+dp[i])
A题解: 做过牛客寒假场的 就应该很熟悉了 (我傻逼了 一直想着从1推到n 成功 )
输入的是成功的概率 而且答案要逆元取模 所以不妨先对概率逆元取模再去运算
a是输入的概率分母  b是失败概率的分子
受限于卡内存,只能滚动数组搞
我是用的f 和ff数组 分别记录的第i和第i-1次的状态
在这里插入图片描述
E题解:同样用逆向思维比较好解题 ,当然正向求也可以 两种方案我都AC了
同理 先对概率逆元再去运算
用add记录总概率 最终结果*2000%mod
转移在这里插入图片描述
C题解 :困扰了我很久,得到大佬指点茅塞顿开
不妨用ff[][]二维string 记录i到j的字符串
f[]记录最终的结果 f数组先要初始化 特别注意 s长度较小以至于不压缩就最短(len<=2)
当len>=3
有以下思考 在这里插入图片描述
f[L][R]=R-L+2;
f[L][R] = min(f[L][R], min(f[L][L] + f[L + 1][R],2 + f[L + 1][R]) );
在这里插入图片描述
我们开一个z(L+1开始)循环 以达到 f[L][R] = min(f[L][R],min(f[L][z] + f[z + 1][R], (z - L + 2) + f[z + 1][R]) ); 为什么呢????好多问号
这个是因为你可能压根没有必要在这里算压缩,这里压缩的还不如前面算完的两个区间合并来得好
而且我们用的if (value[L][k] == value[k + 1][k + len2]) 来作为寻找压缩串的入口
如果这个地方进不去,那么这个L R区间就没有值了 简单来说就两种状态 压缩/不压缩

开一个k循环(L+1) [L,k]作为让别人替换的串,len2 = k - L + 1; 利用预先处理好的ff数组去寻找循环节 num记录下循环节的个数 也就是可以压缩成R的个数 (k循环处理之前L到z的压缩因此if (k + len2 > z)continue; 小朋友是不是有很多问号??? 是这样的 根据M的规则 标志的循环节相当于压缩了一次 R重复压缩一次 如果只有一个循环节 那么就是这样子的M循环节 串反而多了一个字符
因此k+len2>2保证的是至少可以压缩2个以上
int v = 0;
if (z + 1 <= R)v = f[z + 1][R];
f[L][R] = min(f[L][R], v + (R - L + 1) - num * (k - L + 1) + num + 1);
}
输出f[0][n-1]-1 ans

赛后总结: 能秒的题就直接写 (A卡了1h .。。也不知道在干啥)
因为出题人的锅,我学到了逆元卡精确值的操作。。。

ps:求关注 求关注 求关注 每次cf终测完了第一时间发题解
https://paste.ubuntu.com/p/5Y29WgR9fb/

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45948940/article/details/105191563