2024牛客寒假算法基础集训营1题解(A、L、M)

【链接】:https://www.nowcoder.com/link/winter242

比赛时间:2024-02-02    13:00-18:00

赛制:ACM

前提:这三道是本小白比赛期间打出的,顺带复个盘,剩下的就是补题了o(╥﹏╥)o

目录

A.DFS搜索

L.要有光

M.牛客老粉才知道的秘密

A.DFS搜索

思路:字符串,for循环,查找,判断是否存在
子序列的定义:从原字符串中选择一些字符,将这些字符按照其在原串中的顺序拼接起来,得到的就是原字符串的一个子序列。例如:ABCDA的子序列可以为ACA、ABCDA、BA等等,但不能为ABE、CBA、AAD。

#include <bits/stdc++.h>

using namespace std;
bool DFS(string s){
    int len=s.size();
    int ans=0;
    for(int i=0;i<len-2;i++){
        if(s[i]=='D'){
            for(int j=i+1;j<len-1;j++){
                if(s[j]=='F'){
                    for(int k=j+1;k<len;k++){
                        if(s[k]=='S')ans++;
                    }
                }
            }
        }
    }
    if(ans)return 1;
    else return 0;
}
bool dfs(string s){
    int len=s.size();
    int ans=0;
    for(int i=0;i<len-2;i++){
        if(s[i]=='d'){
            for(int j=i+1;j<len-1;j++){
                if(s[j]=='f'){
                    for(int k=j+1;k<len;k++){
                        if(s[k]=='s')ans++;
                    }
                }
            }
        }
    }
    if(ans)return 1;
    else return 0;
}
int main() {
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t;cin>>t;
    for(int i=0;i<t;i++){
        int n;cin>>n;
        string s;cin>>s;
        int a=0,b=0;
        if(DFS(s))a=1;
        if(dfs(s))b=1;
        cout<<a<<" "<<b<<'\n';
    }
    return 0;
}

 复盘:代码感觉太过于乱,且代码量太大,不够精简

看完题解后,才发现数据给的那么小,就是为了让我比赛期间打的那个i,j,k这种时间复杂度为O(n^3)好过。。。。。

重新写了个代码,AC,这个的话时间复杂度为O(n)

#include <bits/stdc++.h>

using namespace std;
string s1="DFS",s2="dfs";
int main() {
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t;cin>>t;
    while(t--){
        int n;cin>>n;
        string s;cin>>s;
        int a=0,b=0;
        int temp1=0,temp2=0;
        for(int i=0;i<n;i++)
        {
            if(s[i]==s1[a])a++;
            if(s[i]==s2[b])b++;
        }
        if(a==3)temp1=1;
        if(b==3)temp2=1;
        cout<<temp1<<" "<<temp2<<'\n';
    }
    return 0;
}

DFS搜索:深度优先搜索

牛客题解给的解法有两种:

1. 设置变量p表示DFS目前已经匹配到了第几个字母,遇到下一个字母就让p++,检查p是不是3

2.枚举三个位置i,j,k,判断s[i],s[j],s[k],是否分别对应DFS

L.要有光

思路:手推,画图

#include <bits/stdc++.h>

using namespace std;

int main() {
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t;cin>>t;
    while(t--){
        int c,d,h,w;cin>>c>>d>>h>>w;
        double ans=0;
        ans=3*w*c;
        cout<<ans<<'\n';
    }
    return 0;
}

 复盘:这个比赛期第一眼看到后,感觉这道题有点麻烦,就懒得去思考,打着打着有人跟我说了才去看,发现这道题其实是个很简单的数学问题,就是需要画一下,而且最优其实的是将光源放在地上

M.牛客老粉才知道的秘密

思路:手推,找规律,多尝试几组样例

所以在推导过程中,会发现只需要考虑两种情况就行

①n为6的倍数    ②n不为6的倍数

#include <bits/stdc++.h>

using namespace std;

int main() {
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t;cin>>t;
    for(int i=0;i<t;i++)
    {
        int n;cin>>n;
        if(n%6==0)cout<<n/6<<'\n';
        else cout<<n/6*2<<'\n';
    }
    return 0;
}

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

July.19th

感谢各位对我的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值