牛客小白月赛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一直统计过程中的最大值,因为障碍的存在,结果可能并不是最后终点

posted @ 2025-03-21 23:22  Fllipped  阅读(23)  评论(0)    收藏  举报