蓝桥杯刷题冲刺 | 倒计时3天

文章介绍了蓝桥杯竞赛前的冲刺准备,重点讲解了如何解决数的三次方根问题,包括两种不同的C++解决方案,以及模拟散列表和字符串哈希的实现,强调了map和字符串子串匹配在编程竞赛中的应用。
摘要由CSDN通过智能技术生成

作者:指针不指南吗
专栏:蓝桥杯倒计时冲刺

🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾

1.数的三次方根

  • 题目

    链接: 790. 数的三次方根 - AcWing题库

    给定一个浮点数 n,求它的三次方根。

    输入格式

    共一行,包含一个浮点数 n。

    输出格式

    共一行,包含一个浮点数,表示问题的解。

    注意,结果保留 6 位小数。

    数据范围

    −10000≤n≤10000

    输入样例:

    1000.00
    

    输出样例:

    10.000000
    
  • 第一次 AC 9/14

    #include<bits/stdc++.h>
    using namespace std;
    
    
    int main()
    {
        double n;
        scanf("%lf",&n);
        
        if(n<0)
        {
            cout<<'-';
            n=-n;
        }
        
        double l=0,r=n;
        
        while(r-l>1e-8)
        {
            double mid=(r+l)/2;
            
            if(mid*mid*mid>n)   r=mid;
            else l=mid;
        }
        
        printf("%.6f",l);
        
        return 0;
    }
    

    刚开始没有注意负数,后来调式的时候发现错误,但写出来处理负数,逻辑发生错误

  • 第二次 AC 100%

    #include<bits/stdc++.h>
    using namespace std;
    
    
    int main()
    {
        double n;
        scanf("%lf",&n);
       
        double l=-1000,r=1000;
       
        while(r-l>1e-8)
        {
            double mid=(r+l)/2;
            
            if(mid*mid*mid>=n) r=mid;
            else l=mid;   
        }
        
        printf("%.6f",l);
        
        return 0;
    }
    
  • 另一种做法 直接调用函数

    #include<bits/stdc++.h>
    using namespace std;
    
    
    int main()
    {
        double n;
        scanf("%lf",&n);
       
        printf("%f",cbrt(n));  //cbrt开立方根函数,printf默认输出6位小数
        
        return 0;
    }
    

2.模拟散列表

  • 题目

    链接: 840. 模拟散列表 - AcWing题库

    维护一个集合,支持如下几种操作:

    1. I x,插入一个数 x;
    2. Q x,询问数 x 是否在集合中出现过;

    现在要进行 N 次操作,对于每个询问操作输出对应的结果。

    输入格式

    第一行包含整数 N,表示操作数量。

    接下来 N 行,每行包含一个操作指令,操作指令为 I xQ x 中的一种。

    输出格式

    对于每个询问指令 Q x,输出一个询问结果,如果 x 在集合中出现过,则输出 Yes,否则输出 No

    每个结果占一行。

    数据范围

    1≤N≤ 1 0 5 10^5 105
    1 0 9 10^9 109 ≤x≤ 1 0 9 10^9 109

    输入样例:

    5
    I 1
    I 2
    I 3
    Q 2
    Q 5
    

    输出样例:

    Yes
    No
    
  • 第一次 AC 100%

    #include<bits/stdc++.h>
    using namespace std;
    
    map<int,int> m;
    
    int n;
    
    int main()
    {
        scanf("%d",&n);
        
        char op[2];
        int x;
        
        while(n--)
        {
            scanf("%s%d",op,&x);
            
            if(op[0]=='I')
            {
                m[x]=1;
            }else{
                m[x]==1?puts("Yes"):puts("No");
            }
        }
        
        return 0;
    }
    

    我体会到了 map 的快乐

2.字符串哈希

  • 题目

    链接: 841. 字符串哈希 - AcWing题库

    给定一个长度为 n 的字符串,再给定 m 个询问,每个询问包含四个整数 l1,r1,l2,r2,请你判断 [l1,r1]和 [l2,r2] 这两个区间所包含的字符串子串是否完全相同。

    字符串中只包含大小写英文字母和数字。

    输入格式

    第一行包含整数 n 和 m,表示字符串长度和询问次数。

    第二行包含一个长度为 n 的字符串,字符串中只包含大小写英文字母和数字。

    接下来 m 行,每行包含四个整数 l1,r1,l2,r2,表示一次询问所涉及的两个区间。

    注意,字符串的位置从 11 开始编号。

    输出格式

    对于每个询问输出一个结果,如果两个字符串子串完全相同则输出 Yes,否则输出 No

    每个结果占一行。

    数据范围

    1≤n,m≤ 1 0 5 10^5 105

    输入样例:

    8 3
    aabbaabb
    1 3 5 7
    1 3 6 8
    1 2 1 2
    

    输出样例:

    Yes
    No
    Yes
    
  • 第一次 AC 11/13 TLE

    #include<bits/stdc++.h>
    using namespace std;
    
    int main()
    {
        int n,m;
        string s;
        cin>>n>>m>>s;
        
        string t,u;
        
        while(m--)
        {
            int a,b,c,d;
            scanf("%d%d%d%d",&a,&b,&c,&d);
            
            t=s.substr(a-1,b-a+1);
            
            u=s.substr(c-1,d-c+1);  //注意后面这个参数 是要截取字串的长度,长度+1,也要记住!
            
            t==u?puts("Yes"):puts("No");
        }
        
        return 0;
    }
    

    字符串截取函数 substr 真不错

  • 第二次 哈希字符串公式法

    #include<iostream>
    #include<cstdio>#include<string>
    using namespace std;
    typedef unsigned long long ULL;
    const int N = 1e5+5,P = 131;//131 13331
    ULL h[N],p[N];
    
    // h[i]前i个字符的hash值
    // 字符串变成一个p进制数字,体现了字符+顺序,需要确保不同的字符串对应不同的数字
    // P = 131 或  13331 Q=2^64,在99%的情况下不会出现冲突
    // 使用场景: 两个字符串的子串是否相同
    ULL query(int l,int r){
        return h[r] - h[l-1]*p[r-l+1];
    }
    int main(){
        int n,m;
        cin>>n>>m;
        string x;
        cin>>x;
    
        //字符串从1开始编号,h[1]为前一个字符的哈希值
        p[0] = 1;
        h[0] = 0;
        for(int i=0;i<n;i++){
            p[i+1] = p[i]*P;            
            h[i+1] = h[i]*P +x[i];      //前缀和求整个字符串的哈希值
        }
    
        while(m--){
            int l1,r1,l2,r2;
            cin>>l1>>r1>>l2>>r2;
            if(query(l1,r1) == query(l2,r2)) printf("Yes\n");
            else printf("No\n");
    
        }
        return 0;
    }
    

Alt

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

指针不指南吗

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值