牛客小白月赛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]));