??引言??
大家好啊,我是执梗。最近一周多都没有更新文章了,因为确实是非常忙,在上篇文章了一下开启了蓝桥打卡31日的活动。每天忙着群里管理解答,统计打卡,寻找真题,根本没有时间更新文章。每天也过的非常的累,这篇文章也是断断续续写了几天,这次也是将这段时间训练的真题总结了一下,还请大家多多支持。
讲解的题目大多都是这星期内训练营内每日训练的题目,因为我是Java语言实现的,当然群内也有各种语言非常多的大佬写的题解,后面我也会附上他们的链接,大家可以去看看他们的优质题解。包括JAVA、C++、Python都有(很多都是这几天的热榜文)
??精彩回放??
蓝桥真题4 | 【蓝桥真题4】练练填空就想进国赛?拿下大题才能让你真正有底气(蓝桥31日冲刺打卡) |
蓝桥真题3 | 【蓝桥真题3】蓝桥改革变难,想进国赛这些能力你可缺一不可 |
蓝桥真题2 | 【蓝桥真题2】蓝桥杯不会全排列,那就只能写10个for循环了【内附近8年真题资源】 |
蓝桥真题1 | 【蓝桥真题1】这道用了7个for循环的蓝桥真题,让舍友哭着跑出考场【内附原题资源】 |
1.等差数列
2.买不到的数目
3.连号区间数
4.递增三元组
5.回文日期
6.全球变暖
7.数的幂次
8.最大乘积
9.含二天数
10.积木大赛
11.大佬候选区(三门语言大佬题解可供选择)
1.等差数列
数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一 部分的数列,只记得其中 N 个整数。等差数列,大家高中做烂了的题目。相信大家光看题目还是很兴奋的吧哈哈哈,感觉非常简单,但是还是有一些需要注意的细节。首先拿到这道题目要明白和想清楚下面几个点
现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?
题目链接:等差数列
输入输入可在题目链接查看
- 给定的序列是不是有序的?我们需不需要排序?
- 为了保证等差数列尽可能短,我们应该如何去确定公差?
答案就用数组中的最大值减去最小值然后除以差值的最大公约数,然后+1(因为还得加上数列中最小的元素),当然我们需要对公差为0的情况进行特判,不然会出现除零异常。如果不太理解的建议草稿纸演示一遍非常容易搞懂。
让我们来看看代码实现:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] arr=new int[n];
for(int i=0;
i
2.买不到的数目
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。这题考察的是数论的知识——对于互质的两个数a和b,其不能组成的最大整数为a*b-a-b。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
题目链接:买不到的数目
这里不展开讲具体的证明,有兴趣的可以上网了解,结论很简单,大家记住就好。
注意这里a和b一定得是互质的,否则是无解的。题目给你的例子也肯定是会互相为质数的,除非题目有说若无解则输出-1。当然这题也可以暴力去求解一下。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
System.out.println(n*m-n-m);
}
}
3.连号区间数
小明这些天一直在思考这样一个奇怪而有趣的问题:这道题唯一的核心就是:如何保证一个子数组是一个公差为1的等差数列。
在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是:
如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元素)递增排序后能得到一个长度为R-L+1的“连续”数列,则称这个区间连号区间。
当N很小的时候,小明可以很快地算出答案,但是当N变大的时候,问题就不是那么简单了,现在小明需要你的帮助。
题目链接:连号区间数
我们要明白一个性质。对于数组arr一段子数组[i,j],如果这段序列最大值为max,最小值为min。如果max-min==j-i,那么说明这段子数组就是一段公差为1的等差数列。
所以对于每一段子数组,我们可以去遍历获得它的最大值和最小值,然后判断它们的差值是否等于下标差。
直接看代码即可,理解了原理就非常简单:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] arr=new int[n];
for(int i=0;
i
4.递增三元组
给定三个整数数组这道题的要求我们分别从A,B,C找出三个数。保证A[i] 代码转换:
A = [A1, A2, ... AN],
B = [B1, B2, ... BN],
C = [C1, C2, ... CN],
请你统计有多少个三元组(i, j, k) 满足:
1. 1 <= i, j, k <= N
2. Ai < Bj < Ck
题目链接:递增三元组
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] A=new int[n];
int[] B=new int[n];
int[] C=new int[n];
for(int i=0;
i>1;
if(arr[mid]<=target) l=mid+1;
else r=mid;
}
return l;
}
//从A数组中找到一个小于target的最大数
static int test2(int[] arr,int target) {
if(arr[0]>=target) return -1;
int l=0;
int r=arr.length-1;
while(l>1;
if(arr[mid]>=target) r=mid-1;
else l=mid;
}
return l;
}
}
5.回文日期
一道代码量比较大的模拟题,考察的又是时间的处理,这里我同样套用之前蓝桥真题中讲过的日期模拟模板。模拟能力是一项考察算法能力很基础的一项,一旦代码量一大许多同学就会在各种地方出现问题,而且由于代码量大能以发现问题。如果能AC这题相信对你的模拟能力有很大的提升,我们直接来看代码转换:
文章图片
题目链接:回文日期
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
static int[] M={0,31,28,31,30,31,30,31,31,30,31,30,31};
static int a;
static int b;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
List list=new ArrayList<>();
while(n!=0) {
list.add(0,n%10);
n/=10;
}
int y=list.get(0)*1000+list.get(1)*100+list.get(2)*10+list.get(3);
int m=list.get(4)*10+list.get(5);
int d=list.get(6)*1+list.get(7);
boolean flag1=true;
boolean flag2=true;
String anser1="";
String anser2="";
while(flag1||flag2) {
if(y%400==0||(y%4==0&&y%100!=0)) {
M[2]=29;
}else {
M[2]=28;
}
d++;
if(d>M[m]) {
d=1;
m++;
}
if(m>12) {
m=1;
y++;
}
if(check1(y,m,d)&&flag1) {
anser1=test(y,m,d);
flag1=false;
}
if(check2(y,m,d)&&flag2) {
anser2=test(y,m,d);
flag2=false;
}
}
System.out.println(anser1);
System.out.println(anser2);
}
static boolean check1(int y,int m,int d) {
String sb=test(y,m,d);
int n=sb.length();
int l=0;
int r=n-1;
while(l
6.全球变暖
你有一张某海域NxN像素的照片,"."表示海洋、"#"表示陆地,如下所示:题目可以用深搜和广搜来做,我们套模板即可。深搜和广搜的重要性不言而喻,这道题大家拿来练手是非常合适的。无论是深搜还是广搜,每次我们遍历一个岛屿时,都要判断这个岛屿是否存在上下左右都是陆地的的陆地。这里要注意的是由于深搜会进行栈递归,在最后一个大数据的情况下会爆栈,而广搜就没有这个问题。下面贴上两种代码
.......
.##....
.##....
....##.
..####.
...###.
.......
其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
.......
.......
.......
.......
....#..
.......
.......
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
题目链接:全球变暖
深度优先搜索:
import java.util.Scanner;
public class Main {
static int[] dx= {1,-1,0,0};
static int[] dy= {0,0,1,-1};
static boolean[][] visit;
static int ans=0;
static boolean flag=false;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
char[][] arr=new char[n][n];
for(int i=0;
i
宽度优先搜索:
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static int[] dx= {1,-1,0,0};
static int[] dy= {0,0,1,-1};
static boolean[][] visit;
static int ans=0;
static boolean flag=false;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
char[][] arr=new char[n][n];
for(int i=0;
i queue=new LinkedList<>();
queue.offer(new int[] {i,j});
visit[i][j]=true;
dfs(arr,queue);
if(!flag) ans++;
flag=false;
}
}
}
System.out.println(ans);
}
static void dfs(char[][] arr,Queue queue) {
while(!queue.isEmpty()) {
int size=queue.size();
while(size-->0) {
int[] curr=queue.poll();
int a=curr[0];
int b=curr[1];
if(check(arr,a+dx[0],b+dy[0])&&check(arr,a+dx[1],b+dy[1])&&check(arr,a+dx[2],b+dy[2])&&check(arr,a+dx[3],b+dy[3])) {
flag=true;
}
for(int i=0;
i<4;
++i) {
int newX=a+dx[i];
int newY=b+dy[i];
if(arr[newX][newY]=='#'&&!visit[newX][newY]){
visit[newX][newY]=true;
queue.offer(new int[] {newX,newY});
}
}
}
}
}
static boolean check(char[][] arr,int i,int j) {
return arr[i][j]=='#';
}
}
7.数的幂次
考察快速幂的考点,这个考点还是比较重要且常考的。大家可以直接通过快速幂函数的公式套进去即可。大家复制下来背下来直接食用即可,类似gcd一样。
文章图片
题目链接:数的幂次
import java.io.*;
import java.util.*;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer st = new StreamTokenizer(br);
static PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));
public static void main(String[] args)throws Exception {
int t=nextInt();
while(t-->0) {
int n=nextInt();
int m=nextInt();
int p=nextInt();
out.write(check(n,m,p)+"\n");
}
out.flush();
}
//快速幂函数,赋值照用即可
static long check(long a,int k,int p) {
long res=1;
while(k>0) {
//这样判断k的二进制最后一位是否是1
if((k&1)==1) res=res*a%p;
k>>=1;
a=(long)a*a%p;
}
return res;
}// 读入整形(一个)
public static int nextInt() throws Exception {
st.nextToken();
return (int) st.nval;
// nval 读入的是 double 类型
}// 读取字符串(一个)
// 若读入的不是字符串,会 null
public static String nextStr() throws Exception {
st.nextToken();
return st.sval;
}
}
8.最大乘积
还是全排列的问题,但是这里我们需要去考虑插入乘号的位置。乘号可以放在第一个数字之后,或者最后一个数字之前。然后我们去判断乘积是否符合数字1~9的排列情况,如果符合就在已保存的值中取更大值。大家最好把每一段的逻辑抽成一个方法去写,这样出错我们可以更容易的去排错。
文章图片
题目链接:最大乘积
import java.util.HashSet;
import java.util.Set;
public class 最大乘积 {
static int max=0;
static int[] arr= {1,2,3,4,5,6,7,8,9};
public static void main(String[] args) {
dfs(0);
System.out.println(max);
}
//全排列
static void dfs(int k) {
if(k==9) {
check();
return;
}
for(int i=k;
i0) {
count1=count1*10+arr[pre];
pre++;
}
int count2=0;
for(int i=pre;
i set=new HashSet<>();
for(int i=1;
i<=9;
++i) set.add(i);
while(n!=0) {
int a=n%10;
if(!set.contains(a)) return false;
else set.remove(a);
n/=10;
}
return set.size()==0;
}
//交换函数
static void exch(int a,int b) {
int tmp=arr[a];
arr[a]=arr[b];
arr[b]=tmp;
}
}
9.含二天数
小蓝特别喜欢 22,今年是公元 2020 年,他特别高兴,因为每天日历上都可以看到 22。还是同样的日期问题,调用我们的日期模板直接秒杀即可!
如果日历中只显示年月日,请问从公元 1900 年 1 月 1 日到公元 99 年 12 月 31 日,一共有多少天日历上包含 22。即有多少天中年月日的数位中包含数字 2。
题目:含2天数
代码转换:
public class 含2天数 {
static int[] M= {0,31,28,31,30,31,30,31,31,30,31,30,31};
public static void main(String[] args) {
int ans=0;
int y=1900,m=1,d=1;
//先升日期再升值
while(y!=9999||m!=12||d!=31) {
if(y%400==0||(y%4==0&&y%100!=0)){
M[2]=29;
}else {
M[2]=28;
}
d++;
if(d>M[m]) {
m++;
d=1;
}
if(m>12) {
m=1;
y++;
}
if(check(y,m,d)) {
ans++;
}
}
System.out.println(ans);
}
static boolean check(int y,int m,int d) {
while(y!=0) {
if(y%10==2) return true;
y/=10;
}
while(m!=0) {
if(m%10==2) return true;
m/=10;
}
while(d!=0) {
if(d%10==2) return true;
d/=10;
}
return false;
}
}
10.积木大赛
题目的本质是贪心。对于增加操作,我们也可以理解成将数组所有元素减到0的最少操作次数。我们可以将原数组分为n个递增的子数组,a[0,i],a[i+1,j],a[j+1,k]....。答案就是每段递增子序列的最大值减去除去第一段的每段的最小值之和。
文章图片
题目链接:积木大赛
代码转换:
import java.util.Scanner;
public class 积木大赛 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int ans=0,last=0;
for(int i=0;
ilast) ans+=(a-last);
last=a;
}
System.out.println(ans);
}
}
11.大佬候选区(三门语言大佬题解可供选择)执梗的题解写的有些比较粗略和拉胯,很多非Java语言的同学看的肯定也很难受,这里附上群内三种语言的各种大佬链接,大家可以挑选各自语言对于的挑选观看,他们都写下了这十天集训的题解。而且有任何不懂的都可以随时免费私信他们,耐心解答!! 也可以找他们或者我领取真题资料
1.C++语言
杨枝(热榜常客,题解详细,排版优美,细心解答) | 杨枝的博客_CSDN博客-算法基础,朝题夕解,数据结构领域博主 |
Pluto(算法爱好者,各种周赛,砍瓜切菜) | 学习算法的小菜鸡的博客_CSDN博客-笔记领域博主 |
泡泡(大一学籍大四实力,国一有力竞争者) | 是泡泡的博客_CSDN博客-31日打卡领域博主 |
折叠的小饼干(实力学姐,懂得都懂) | 被折叠的小饼干的博客_CSDN博客-Acwing算法模板,Leetcode,Javaweb领域博主 |
kano(擅长C++,掌握Python,热心解答) | kano_s的博客_CSDN博客-笔记领域博主 |
金枪鱼(C++算法爱好者,思路通透) | 永遇乐金枪鱼的博客_CSDN博客-领域博主 |
小怂(刷爆蓝桥云课,励志拿国二的大二猛男) | 小怂很怂的博客_CSDN博客-领域博主 |
小羊不会飞(Java猛男,算法爱好者,题解非常详细) | 小羊不会飞的博客_CSDN博客-领域博主 |
Hydrion-Qlz(西安交大大佬,算法爱好者) | Hydrion-Qlz的博客_CSDN博客-操作系统笔记,系统分析与设计,LeetCode领域博主 |
小成同学(Java算法猛男,刷题狂魔) | 小成同学_的博客_CSDN博客-蓝桥杯,JavaSE,刷题笔记领域博主 |
托马斯—酷涛(Java算法爱好者,对多个方向均有涉猎) | 托马斯-酷涛的博客_CSDN博客-运维,hadoop,Linux领域博主 |
小王同学(算法博客详细,登上热榜第一) | 学好c语言的小王同学的博客_CSDN博客-领域博主 |
小郑(国赛强劲实力选手,热榜常客) | Py小郑的博客_CSDN博客-Python,笔记,蓝桥杯领域博主 |
小蓝(算法思路清晰,博客题解详细) | 小蓝刷题的博客_CSDN博客-备战蓝桥杯,数论,枚举模拟领域博主 |
秋刀鱼(会三门语言,题解地表最详细) | 秋刀鱼与 猫的博客_CSDN博客-笔记领域博主 |
文章图片
【蓝桥真题|【蓝桥真题五】带三百人训练了十天精选蓝桥真题,看看他们都练些什么(三门语言题解)】
推荐阅读
- 蓝桥刷题冲冲!|【真题】第十一届蓝桥真题
- leetcode|LeetCode 48. Rotate Image 时间复杂度(O(n))
- LeetCode|LeetCode 53. Maximum Subarray 时间复杂度(O(n))
- python|【小白向】蓝桥杯练习系统——基础练习部分python语句解析
- LeetCode|LeetCode 42. Trapping Rain Water 时间复杂度(O(n))
- leetcode|算法入门之字符串(Python)【初级算法——字符串】【蓝桥杯练习】【力扣练习】
- 数据结构与算法|【蓝桥杯】 BASIC-16 分解质因数
- 备战蓝桥杯|蓝桥杯python组十二届省赛真题+解析+代码(通俗易懂版)
- 备战蓝桥杯|蓝桥杯python组十一届省赛真题+解析+代码(通俗易懂版)