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

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

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

文章目录

  • 1.最长递增
  • 2.走迷宫
  • 3.解立方根
  • 4.回文特判
  • 5.修改数组

1.最长递增

  • 题目

    链接: 最长递增 - 蓝桥云课 (lanqiao.cn)

    在数列 a1,a2,⋯,a n 中,如果 ai*<*ai*+1<a**i+2<⋯<a**j,则称 a* ia j 为一段递增序列,长度为 ji+1。

    定一个数列,请问数列中最长的递增序列有多长。

    输入描述

    输入的第一行包含一个整数 n*。

    第二行包含 n 个整数 a*1,a2,⋯,*a n,相邻的整数间用空格分隔,表示给定的数列。

    其中, 2≤n≤1000,0≤数列中的数≤ 1 0 4 10^4 104

    输出描述:

    输出一行包含一个整数,表示答案。

    输入输出样例

    输入

    7
    5 2 4 1 3 7 2
    

    输出

    3
    
  • 第一次 AC 100%

    #include<bits/stdc++.h>
    using namespace std;
    
    const int N=1010;
    
    int n,ans;
    int a[N];
    
    int main()
    {
    	scanf("%d",&n);
    	
    	for(int i=0;i<n;i++)
    	{
    		scanf("%d",&a[i]);
    	}
    	
    	for(int i=0;i<n;i++)
    	{
    		for(int j=0;j<n;j++)
    		{
    			if(a[j]>=a[j+1])
    			{
    				ans=max(ans,j-i+1);
    				i=j+1;
    			}
    		}
    	}
    	
    	cout<<ans;
    	
    	return 0;
    }
    

    生活不易,我的生活里还是有光的hhh

  • 反思

    这道题用的是 双指针

    i 表示 一个递增序列第一个数的下标;j 表示 一个递增序列后面的数的下标,

    j 不断地往下走,如果下一个数不大于现在的数,做出更新:

    ans 取 max,递增数组的第一个数的下标做出改变,更新为 j+1,即j+1是下一个递增序列的第一个数的下标,暴力枚举到最后

    • 动手在纸上模拟,思路就会很清晰,千万别硬想

2.走迷宫

  • 题目

    链接: 走迷宫 - 蓝桥云课 (lanqiao.cn)

    给定一个 N×M 的网格迷宫 G*。G* 的每个格子要么是道路,要么是障碍物(道路用 1 表示,障碍物用 0 表示)。

    已知迷宫的入口位置为 (x1,y1),出口位置为 (x2,y2)。问从入口走到出口,最少要走多少个格子。

    输入描述

    输入第 1 行包含两个正整数 N,M,分别表示迷宫的大小。

    接下来输入一个 N×M 的矩阵。若 G i,j=1 表示其为道路,否则表示其为障碍物。

    最后一行输入四个整数 x1,y1,x2,y2,表示入口的位置和出口的位置。

    1≤N,M≤100。

    输出描述

    输出仅一行,包含一个整数表示答案。

    若无法从入口到出口,则输出 −1。

    输入输出样例

    示例 1

    输入

    5 5 
    1 0 1 1 0
    1 1 0 1 1 
    0 1 0 1 1
    1 1 1 1 1
    1 0 0 0 1
    1 1 5 5 
    

    输出

    8
    
  • 第一次 AC 72%

    #include<bits/stdc++.h>
    using namespace std;
    
    typedef pair<int,int> PII;
    
    const int N=110;
    
    int n,m;
    int x1,y1,x2,y2;
    
    int g[N][N]; 
    int d[N][N];
    int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0};
    
    void bfs()
    {
    	memset(d,-1,sizeof d);
    	d[x1][y1]=0;
    	
    	queue<PII> q;
    	q.push({x1,y1});
    	
    	while(q.size())
    	{
    		auto t=q.front();
    		q.pop();
    		
    		for(int i=0;i<4;i++)
    		{
    			int x=t.first+dx[i],y=t.second+dy[i];
    			if(d[x][y]==-1&&x>=1&&x<=n&&y>=1&&y<=m&&g[x][y]==1)
    			{
    				q.push({x,y});
    				d[x][y]=d[t.first][t.second]+1;
    				if(x==x2&&y==y2)
    				{
    					cout<<d[x][y];
    					return ;
    				}
    			}
    		}
    	}
    	
    }
    
    int main()
    {
    	cin>>n>>m;
    	
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=m;j++)
    			cin>>g[i][j];
    		
    	cin>>x1>>y1>>x2>>y2;	
    			
    	bfs();
    	
    	return 0;
    }
    
  • 第二次 AC 100%

    #include<bits/stdc++.h>
    using namespace std;
    
    typedef pair<int,int> PII;
    
    const int N=110;
    
    int n,m;
    int x1,y1,x2,y2;
    
    int g[N][N]; 
    int d[N][N];
    int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0};
    
    int bfs()
    {
    	memset(d,-1,sizeof d);
    	d[x1][y1]=0;
    	
    	queue<PII> q;
    	q.push({x1,y1});
    	
    	while(q.size())
    	{
    		auto t=q.front();
    		q.pop();
    		
    		for(int i=0;i<4;i++)
    		{
    			int x=t.first+dx[i],y=t.second+dy[i];
    			if(d[x][y]==-1&&x>=1&&x<=n&&y>=1&&y<=m&&g[x][y]==1)
    			{
    				q.push({x,y});
    				d[x][y]=d[t.first][t.second]+1;
    				if(x==x2&&y==y2)
    				{
    					return d[x][y];
    				}
    			}
    		}
    	}
    	return -1;
    }
    
    int main()
    {
    	cin>>n>>m;
    	
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=m;j++)
    			cin>>g[i][j];
    		
    	cin>>x1>>y1>>x2>>y2;	
    			
    	cout<<bfs();
    	
    	return 0;
    }
    
  • 反思

    标准的模板题,眼高手低,第一次,没有仔细阅读输出提示,-1 的情况

3.解立方根

  • 题目

    链接: 解立方根 - 蓝桥云课 (lanqiao.cn)

    给定一个正整数 N,请你求 N 的立方根是多少。

    输入描述

    第 1 行为一个整数 T,表示测试数据数量。

    接下来的 T 行每行包含一个正整数 N

    1≤T 1 0 5 10^5 105,0≤N 1 0 5 10^5 105

    输出描述

    输出共 T 行,分别表示每个测试数据的答案(答案保留 3 位小数)。

    输入输出样例

    输入

    3
    0
    1
    8
    

    输出

    0.000
    1.000
    2.000
    
  • 第一次 AC 100%

    #include<bits/stdc++.h>
    using namespace std;
    
    #define eps 1e-5
    
    int main()
    {
    	int n;
    	scanf("%d",&n);
    	
    	while(n--)
    	{
    		int t;
    		scanf("%d",&t);
    		
    		double x=t; 
    		double l=0,r=x;
    		while(r-l>eps)
    		{
    			double mid=(l+r)/2;
    			if(mid*mid*mid<x) l=mid;
    			else r=mid;
    		 } 
    		 
    		printf("%.3f\n",r); 
    	}
    	
    	return 0;
    }
    
  • 反思

    刚看到这道题是先把原来记的笔记看了一遍才能 AC 的
    大家可以移步于这里来看->【算法】二分

    做各种题型的真题,把所有知识点都全部重新复习一遍

    二分

    • 重要的就是把三个板子记住,以及浮点数板子
    • 在浮点数精度问题上,和在某范围内查找某个数的时候特别是大范围就使用二分算法

4.回文特判

  • 题目

    链接: 回文判定 - 蓝桥云课 (lanqiao.cn)

    给定一个长度为 n 的字符串 S。请你判断字符串 S 是否回文。

    输入描述

    输入仅 1 行包含一个字符串 S

    1≤∣S∣≤ 1 0 6 10^6 106,保证 S 只包含大小写、字母。

    输出描述

    若字符串 S 为回文串,则输出 Y,否则输出 N

    输入输出样例

    示例 1

    输入

    abcba
    

    输出

    Y
    

    示例 2

    输入

    abcbb
    

    输出

    N
    
  • 第一次 AC 100%

    #include<bits/stdc++.h>
    using namespace std;
    
    int main()
    {
    	string a;
    	
    	cin>>a;	
    	
    	string t=a;
    	
    	reverse(t.begin(),t.end());
    	
    	string b=t;
    	
    	if(a==b)
    		puts("Y");
    	else puts("N");
    	
    	return 0;
    }
    
  • 补充知识——reverse 函数

    1. reverse是C++下的库函数,可用于翻转字符串,翻转链表等

    2. 使用需要添加头文件

      #include <algorithm>

    3. reverse()会将区间[beg,end)内的元素全部逆序;
      其中区间翻转

      1.reverse(str.begin(),str.end()) 反转字符串
       	 
      2.reverse(vector.begin(),vector.end()) 反转向量
       
      3.reverse(a,a+strlen(a)) 反转数组
      
    4. 该函数无返回值

    5. 错误使用

      int main()
      {
          int a[99];
          for(int i = 0; i < 10; i++)
          {
              cin >> a[i];
          }
          a.reverse();//错误,所有的类型结构,都是不可以的!
          for(int i = 0; i < 10; i++)
          {
              cout << a[i];
          }
      }
      
  • 反思

    reverse 函数

    无返回值,使用临时变量,不免a原始值发生改变

    注意拼写和使用方法,不要a.reverse()

5.修改数组

  • 题目

    链接: 修改数组 - 蓝桥云课 (lanqiao.cn)

    给定一个长度为 N 的数组 A*=[A1,A2,⋅⋅⋅,AN*],数组中有可能有重复出现的整数。

    现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改A2,A3,⋅⋅⋅,A N

    当修改A i 时,小明会检查 A i 是否在 A1 ∼ A i−1 中出现过。如果出现过,则小明会给 A i 加上 1 ;如果新的 A i 仍在之前出现过,小明会持续给 A i 加 1 ,直 到 A i 没有在 A1 ∼A i−1 中出现过。

    A N 也经过上述修改之后,显然 A 数组中就没有重复的整数了。

    现在给定初始的 A 数组,请你计算出最终的 A 数组。

    输入描述

    第一行包含一个整数 N

    第二行包含 N 个整数 A1,A2,⋅⋅⋅,AN

    其中,1≤N 1 0 5 10^5 105,1≤A i 1 0 6 10^6 106

    输出描述

    输出 N 个整数,依次是最终的 A*1,A2,⋅⋅⋅,*AN。

    输入输出样例

    示例

    输入

    5
    2 1 1 3 4
    

    输出

    2 1 3 4 5
    
  • 第一次 AC 0%

    #include<bits/stdc++.h>
    using namespace std;
    
    const int N=1e5+10;
    
    int n;
    int a[N];
    int p[N];
    
    int main()
    {	
    	scanf("%d",&n);
    	
    	for(int i=0;i<n;i++)
    		scanf("%d",&a[i]); 
    	
    	p[a[0]]=a[0];
    	
    	for(int i=1;i<n;i++)
    	{
    		if(p[a[i]]==p[a[0]]) //说明重复
    		{
    			do{
    				a[i]++;
    			}while(p[a[i]]==p[a[0]]); //加完之后的元素还是重复就继续,否则跳出来 
    			
    			p[a[i]]=p[a[0]];
    		}
    	}
    	
    	for(int i=0;i<n;i++)
    		printf("%d ",a[i]); 
    	
    	return 0;
     } 
    

    没有对 p 初始化;

    当元素不同的时候,没有把该元素放进去集合里面,所以集合里面只有以a[0]及和a[0]重复之后,操作加进去的数

  • 第二次 AC 80% + 超时 20%

    思路

    1. 遍历整个数组,判断每个元素是否和前面重复

    2. 不重复:直接放进集合里面

      重复:元素+1,直到与集合里面的元素不重复,然后放进集合里面去

    #include<bits/stdc++.h>
    using namespace std;
    
    const int N=1e5+10;
    
    int n;
    int a[N];
    int p[N];
    
    int main()
    {
    	memset(p,-1,sizeof p);  //初始化数组,在后面判断是否重复的时候使用
    	
    	scanf("%d",&n);
    	
    	for(int i=0;i<n;i++)
    		scanf("%d",&a[i]); 
    	
    	p[a[0]]=a[0];  //以起始元素为 祖宗
    	
    	for(int i=1;i<n;i++)  //遍历整个数组
    	{
    		if(p[a[i]]==p[a[0]]) //说明重复
    		{
    			do{
    				a[i]++; //元素自身+1
    			}while(p[a[i]]==p[a[0]]); //加完之后的元素还是重复就继续,否则跳出来 
    			
    			p[a[i]]=p[a[0]]; //把操作完的元素放进去
    		}
    		else
    			p[a[i]]=p[a[0]];  //和前面不重复的元素,也是需要放到集合里面去的
    	}
    	
    	for(int i=0;i<n;i++)
    		printf("%d ",a[i]); 
    	
    	return 0;
     } 
    
  • 题解

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    const int N = 1100010;
    
    int n;
    int a[N];
    
    int find(int x)                                 // 寻找父节点 + 路径压缩
    {
        if(a[x] != x) a[x] = find(a[x]);            // 如果不指向父节点
        return a[x];
    }
    
    int main()
    {
        for (int i = 1; i <= N; i ++) a[i] = i;     // 初始化,自己是自己的父节点
        
        cin >> n;
        for (int i = 1; i <= n; i ++)
        {
            int x;
            scanf("%d", &x);
            x = find(x);                            // 找到 x 指向的父节点
            printf("%d ", x);
            a[x] = x + 1;                           // 将 x 的父节点更新为 x+1
        }
        
        return 0;
    }
    
  • 补充知识——并查集使用场景

    1. 两个元素是否在同一个集合里面出现过;
    2. 合并两个集合
  • 反思

    已经比较满意了,AC 80%

    这个题,我开始的思路,是比较混乱的,没有理清楚关系,考虑全面

    第二次之后,我觉得重复元素不断+1,是可以优化的,

    取前面所有元素的最大值,然后让重复元素max+1,AW,T_T

    这个题解:

    • 更新父节点真是妙,每一个对应的父节点+1,正好修正我用 max

Alt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/3829.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java版oj 】 day17杨辉三角形的变形、计算某字符出现次数

目录 一、杨辉三角形的变形 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 二、计算某字符出现次数 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代…

Python调用GPT3.5接口的最新方法

GPT3.5接口调用方法主要包括openai安装、api_requestor.py替换、接口调用、示例程序说明四个部分。 1 openai安装 Python openai库可直接通过pip install openai安装。如果已经安装openai&#xff0c;但是后续提示找不到ChatCompletion&#xff0c;那么请使用命令“pip instal…

【ArcGIS Pro二次开发】(18):地理处理工具类【Geoprocessing】补遗

ArcGIS Pro SDK 3.0中的Geoprocessing类是用于执行地理处理工具的核心类。地理处理工具是用于执行空间分析、数据转换、数据管理等任务的工具集&#xff0c;包括常见的空间分析工具、栅格处理工具、矢量处理工具、地图制图工具等。 之前有简单记录了下Geoprocessing工具的用法…

整理了一份github上比较热门的ChatGPT项目,值得收藏

ChatGPT已经火了一段时间了&#xff0c;但是&#xff0c;热度依旧是各大自媒体的热榜。由于&#xff0c;国内不能直接访问ChatGPT,国内的开发者依托OpenAI的接口&#xff0c;开发出一些ChatGPT的应用。今天就整理一下github上最热门的ChatGPT项目。 lencx/ChatGPT 该项目是Cha…

springboot校友社交系统

050-springboot校友社交系统演示录像开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;e…

蓝桥杯第14天(Python版)

并查集的使用# 并查集模板 N400 fa[] def init(): # 初始化&#xff0c;默认自身为根接点for i in range(N):fa.append(i)def merge(x,y): # 发现可以合并&#xff0c;默认选x的根节点为根接点fa[find(x)]find(y)def find(x): # 相等就是根结点&#xff0c;不然就递归查找根…

Vue3监听器使用

watch(监听的对象或值, 回调函数&#xff08;参数新值&#xff0c;旧值&#xff09;, 配置项是对象{ immediate: true//立即监听--进入就会执行一次 deep&#xff1a;true //深度监听 }) 首先引入 import { ref, watch } from vue; 设置响应式数据 const num ref(1) …

【数据结构篇C++实现】- 栈

文章目录&#x1f680;一、栈的原理精讲&#x1f680;二、栈的算法实现⛳栈的顺序存储结构&#x1f389;&#xff08;一&#xff09;顺序栈1.栈的结构体定义2.栈的初始化3.判断空栈4.判断栈满5.元素入栈6.元素出栈7.获取栈顶元素&#x1f389;&#xff08;二&#xff09;共享栈…

冯诺依曼,操作系统以及进程概念

文章目录一.冯诺依曼体系结构二.操作系统&#xff08;operator system&#xff09;三.系统调用和库函数四.进程1.进程控制块&#xff08;PCB&#xff09;2.查看进程3.系统相关的调用4.fork介绍&#xff08;并发引入&#xff09;五.总结一.冯诺依曼体系结构 计算机大体可以说是…

MD5加密竟然不安全,应届生表示无法理解?

前言 近日公司的一个应届生问我&#xff0c;他做的一个毕业设计密码是MD5加密存储的&#xff0c;为什么密码我帮他调试的时候&#xff0c;我能猜出来明文是什么&#xff1f; 第六感&#xff0c;是后端研发的第六感&#xff01; 正文 示例&#xff0c;有个系统&#xff0c;前…

【深度强化学习】(6) PPO 模型解析,附Pytorch完整代码

大家好&#xff0c;今天和各位分享一下深度强化学习中的近端策略优化算法&#xff08;proximal policy optimization&#xff0c;PPO&#xff09;&#xff0c;并借助 OpenAI 的 gym 环境完成一个小案例&#xff0c;完整代码可以从我的 GitHub 中获得&#xff1a; https://gith…

泰克信号发生器特点

泰克信号发生器是一种用于产生各种类型的电子信号的仪器&#xff0c;可以广泛应用于电子、通信、自动化、医疗等领域。泰克信号发生器具有以下特点&#xff1a;多种信号类型&#xff1a;泰克信号发生器可以产生多种类型的电子信号&#xff0c;包括正弦波、方波、三角波、脉冲等…

TitanIDE:云原生开发到底强在哪里?

原文作者&#xff1a;行云创新技术总监 邓冰寒 引言 是一种新的软件开发方法&#xff0c;旨在构建更可靠、高效、弹性、安全和可扩展的应用程序。与传统的应用程序开发方式不同&#xff0c;云原生是将开发环境完全搬到云端&#xff0c;构建一站式的云原生开发环境。云原生的开…

PWM互补输出,以及死区时间计算

本文基于野火例程进行解说 实验内容 本次实验输出一对互补的pwm波&#xff0c;且进行死区时间的计算说明。 代码 互补输出对应的定时器初始化代码&#xff1a; bsp_advance_tim.c /********************************************************************************* fi…

【YOLO】YOLOv8训练自定义数据集(4种方式)

YOLOv8 出来一段时间了&#xff0c;继承了分类、检测、分割&#xff0c;本文主要实现自定义的数据集&#xff0c;使用 YOLOV8 进行检测模型的训练和使用 YOLOv8 此次将所有的配置参数全部解耦到配置文件 default.yaml&#xff0c;不再类似于 YOLOv5&#xff0c;一部分在配置文件…

Anaconda 的安装配置及依赖项的内外网配置

在分享anaconda 的安装配置及使用前&#xff0c;我们必须先明白anaconda是什么&#xff1b;Anaconda是一个开源的Python发行版本。两者区别在于前者是一门编程语言&#xff0c;后者相当于编程语言中的工具包。 由于python自身缺少numpy、matplotlib、scipy、scikit-learn等一系…

Java中的深拷贝和浅拷贝

目录 &#x1f34e;引出拷贝 &#x1f34e;浅拷贝 &#x1f34e;深拷贝 &#x1f34e;总结 引出拷贝 现在有一个学生类和书包类&#xff0c;在学生类中有引用类型的书包变量&#xff1a; class SchoolBag {private String brand; //书包的品牌private int size; //书…

7.网络爬虫—正则表达式详讲

7.网络爬虫—正则表达式详讲与实战Python 正则表达式re.match() 函数re.search方法re.match与re.search的区别re.compile 函数检索和替换检索&#xff1a;替换&#xff1a;findallre.finditerre.split正则表达式模式常见的字符类正则模式正则表达式模式量词正则表达式举例前言&…

2022财报逆转,有赞穿透迷雾实现突破

2022年&#xff0c;商家经营面临困难。但在一些第三方服务商的帮助下&#xff0c;也有商家取得了逆势增长。 2023年3月23日&#xff0c;有赞发布2022年业绩报告&#xff0c;它帮助许多商家稳住了一整年的经营。2022年&#xff0c;有赞门店SaaS业务的GMV达到425亿元&#xff0c…

24万字智慧城市顶层设计及智慧应用解决方案

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。部分资料内容&#xff1a; 4.8 机房消防系统 4.8.1消防系统概况 根据本工程机房消防系统的特殊要求&#xff0c;整个消防系统由火灾报警系统、消防联动系统和气体灭火系统三部…