当前位置: 首页 > article >正文

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

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

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

文章目录

  • 1.选数异或
  • 2.特殊年份

1.选数异或

  • 题目

    链接: 选数异或 - 蓝桥云课 (lanqiao.cn)

    给定一个长度为 n 的数列 A*1,A2,⋯,A n 和一个非负整数 x, 给定 m 次查 询, 每次询问能否从某个区间 [l,r] 中选择两个数使得他们的异或等于 x

    输入格式

    输入的第一行包含三个整数 n,m,x

    第二行包含 n个整数 A1,A2,⋯,A n

    接下来 m 行,每行包含两个整数 l i,r i 表示询问区间 [l i*,*r i] 。

    输出格式

    对于每个询问, 如果该区间内存在两个数的异或为 x 则输出 yes, 否则输出 no。

    样例输入

    4 4 1
    1 2 3 4
    1 4
    1 2
    2 3
    3 3
    

    样例输出

    yes
    no
    yes
    no
    

    样例说明

    显然整个数列中只有 2, 3 的异或为 1。

    评测用例规模与约定

    对于 20% 的评测用例,1≤n,m≤100;

    对于 40% 的评测用例, 1≤n,m≤1000;

    对于所有评测用例, 1≤n,m≤100000,0≤x<220,1≤lirin, 0≤A i<220 。

  • 第一次

    #include<bits/stdc++.h>
    using namespace std;
    
    const int N=1e5+10;
    
    int a[N];
    
    int main()
    {
        int n,m,x;
        scanf("%d%d%d",&n,&m,&x);
        
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        
        int l,r;
        while(m--)
        {
            scanf("%d%d",&l,&r);
            
            int flag=0;
            for(int i=l;i<r;i++)
            {
                for(int j=i+1;j<=r;j++)
                {
                    if(a[i]^a[j]==x)   //这里是个坑 ,符号优先级问题
                    {
                        flag=1;
                        puts("yes");
                        break;
                    }
                }
                if(flag) break;
            }
            if(!flag) puts("no");
        }
        
        return 0;
    }
    

    暴力枚举,样例过不了

    输出的结果里面:前面的都是 yes ,最后一个都是 no

    通过调式发现 a[i]^a[j]!=x , 也会进入 if 语句,是符号优先级的问题

  • 第二次 AC 40%

    #include<bits/stdc++.h>
    using namespace std;
    
    const int N=1e5+10;
    
    int a[N];
    
    int main()
    {
        int n,m,x;
        scanf("%d%d%d",&n,&m,&x);
        
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        
        int l,r;
        while(m--)
        {
            scanf("%d%d",&l,&r);
            
            int flag=0;
            for(int i=l;i<r;i++)
            {
                for(int j=i+1;j<=r;j++)
                {
                    if((a[i]^a[j])==x)  //加上 ()即可
                    {
                        flag=1;
                        puts("yes");
                        break;
                    }
                }
                if(flag) break;
            }
            if(!flag) puts("no");
        }
        
        return 0;
    }
    
  • 正确题解

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 100010;
    int dp[N], n, m, x;
    
    int main() {
        cin >> n >> m >> x;
        unordered_map<int, int> last;
        for(int i=1; i<=n; i++) {
            int a; cin >> a;
            dp[i] = max(dp[i-1], last[x ^ a]);
            //这句应该放到后面, 否则当x=0时会不正确(当x等于0时dp[i] = i, 但是要选两个不同位置的数)
            //更正于2023/01/01
            last[a] = i;
        }
    
        while (m -- ) {
            int l, r; cin >> l >> r;
            cout << (dp[r] >= l ? "yes" : "no") << endl;
        }
    
        return 0;
    }
    
  • 反思

    通过看题解,发现运用到动态规划,emmm,还没有学到,劝退了哈

    但是通过这个题,复习符号优先级,而且 AC 40% ,暴力杯爱了爱了

  • 符号优先级

    img

2.特殊年份

  • 题目

    链接: 特殊年份 - 蓝桥云课 (lanqiao.cn)

    今年是 2021 年, 2021 这个数字非常特殊, 它的千位和十位相等, 个位比 百位大 1 ,我们称满足这样条件的年份为特殊年份。

    输入 5 个年份, 请计算这里面有多少个特殊年份。

    输入格式

    输入 5 行, 每行一个 4 位十进制数 (数值范围为 1000 至 9999), 表示一个 年份。

    输出格式

    输出一个整数, 表示输入的 5 个年份中有多少个特殊年份。

    样例输入

    2019
    2021
    1920
    2120
    9899
    

    样例输出

    2
    

    样例说明

    2021 和 9899 是特殊年份, 其它不是特殊年份。

  • 我的题解

    #include<bits/stdc++.h>
    using namespace std;
    
    bool check(int x)
    {
        int s[4];
        int i=0;
        while(x>0)
        {
            s[i++]=x%10;
            x/=10;
        }
        
        if(s[1]==s[3]&&s[0]==s[2]+1) return true;
        return false;
    }
    
    int main()
    {
        int a[5];
        int res=0;
        
        for(int i=0;i<5;i++)
        {
            scanf("%d",&a[i]);
            if(check(a[i])) res++;
        }
        
        printf("%d",res);
        
        return 0;
    }
    
  • 另一种思路——用字符串

    #include<bits/stdc++.h>
    using namespace std;
    
    int main()
    {
        string str;
        
        int m=5,res=0;
        while(m--)
        {
            cin>>str;
            if(str[0]==str[2]&&str[3]==str[1]+1) res++;  
        }
        
        printf("%d",res);
        
        return 0;
    }
    

    在自己代码实现过程中,str 下标可把我整晕了,建议纸上写一写

  • 反思

    多看题解,学习佬们的代码,拓展思路

    • 数字可以使用 string 字符串,来储存比较!!!

Alt


http://www.kler.cn/a/1837.html

相关文章:

  • RAG实战:构建基于本地大模型的智能问答系统
  • 【蓝桥杯——物联网设计与开发】拓展模块3 - 温度传感器模块
  • 企业数字化转型中的“烟囱效应”:从小烟囱到大烟囱的折中之道
  • 用 gdbserver 调试 arm-linux 上的 AWTK 应用程序
  • WebAssembly与WebGL结合:高性能图形处理
  • 【087】基于51单片机智能宠物喂食器【Proteus仿真+Keil程序+报告+原理图】
  • C# tuple元组详解
  • Java分布式事务(九)
  • 人工智能前沿知识
  • 贪心算法的原理以及应用
  • 2、Django开发总结:官方推荐编码规范
  • 【Git使用学习】本地项目更改以及相对应的Github操作
  • 开箱即用的密码框组件
  • 蓝桥杯每日一真题——[蓝桥杯 2021 省 AB] 砝码称重(背包dp)
  • 可换皮肤的Qt登录界面
  • 【字符串】
  • 上手使用百度文心一言
  • 【SpringMVC】SpringMVC方式,向作用域对象共享数据(ModelAndView、Model、map、ModelMap)
  • 带你看看 TypeScript 5.0 的新特性
  • DJ2-4 进程同步(第一节课)
  • 【数据结构】二叉树(OJ)
  • C/C++每日一练(20230319)
  • 基于微信小程序的校园二手交易平台小程序
  • spark第三章:工程化代码
  • C语言预处理条件语句的 与或运算
  • Linux实操之进程管理