牛客小白月赛111
牛客小白月赛111
2025.03.21
A 田忌赛马
题目简介:田忌赛马,各三个数据
思路:
主要考虑到田忌快的两个马比齐威王慢的两个马快就Yes
想到这一步就over了
B 正/邪
题目简介:这道题主要考察对题干的挖掘
注意点:正义邪恶英雄 分情况讨论
分为以下三种情况
Len=1 0->0,1->1; 无意义,不优
Len=2 00->1, 优 01->0 劣 11->1 劣
Len>2 只要有1就不优或劣,如果都是0 ,两两合1就是Len=2的情况,全部合肯定劣
综上所述,有且仅有00->1这种情况是好的,只需要进行这一步处理即可
因此,遍历字符串统计0的个数,每两个变1即可,就很easy了
for(…………)
ans+=cnt/2;
循环结束后不要忘记对最后一次进行处理
C 复读姬
题目简介:可模拟,可滑动窗口,统计撤回一条消息后的最长连续消息个数
注意点:模拟(滑窗还没学会)
1.定义一个pre数组统计该位前面的连续和,一个suf数组统计该位后面的最大连续个数
2.正序遍历统计pre,逆序遍历统计suf
pre[1]=1;
for(int i = 2;i<=n;i++){
if(s[i]==s[i-1]) pre[i]=pre[i-1]+1;
else pre[i]=1;
}
suf[n]=1;
for(int i = n-1;i>=1;i--){
if(s[i]==s[i+1]) suf[i]=suf[i+1]+1;
else suf[i]=1;
}
代码贴这,注意细节
3.再次遍历找撤回消息,将左边的pre和右边的suf加起来取最大
同时还要再遍历一次不撤回消息求ans,pre,suf最大
for(int i = 2;i<=n-1;i++){
if(s[i-1]==s[i+1])
ans=max(ans,pre[i-1]+suf[i+1]);
}
for(int i =1;i<=n;i++)
ans=max(ans,max(pre[i],suf[i]));
注意i的范围,题目说至多撤回一条,不要忘记遍历不撤回的情况
D 收集金币
题目简介:有障碍的动规,但障碍不是一开始就有,不同于过河卒
注意点:
1.过河卒是统计路径,而此题是收集金币,相当于给每个点赋了权值,因此,障碍不能直接记为0,而应计为-无穷,否则,在取max时,有些情况0可以参与下一步计算
2.对障碍的统计,通过计算步数与所在位置的关系,可以分为一开始就有,或始终没有
3.不同于一般dp,这里的dp数组初始化为INT_MIN,也与每个点赋权值,保证障碍之后的路无法走到
4.既然都初始化为INT_MIN,则需要设置一个0为起点,dp[0][1]=0或dp[1][0]=0;均可
5.结果并不是dp[n][m],而需要定义一个ans一直统计过程中的最大值,因为障碍的存在,结果可能并不是最后终点

浙公网安备 33010602011771号