蓝桥杯
算法解题那些事
这个作者很懒,什么都没留下…
展开
-
拓扑序列求最长路
给定一个 n 个点 m 条边的有向图。图中可能包含重边和自环,也可能不连通。给每个点分配一个小写字母。我们定义一条路径的权值为出现频率最高的字母的出现次数。例如,如果一条路径上的字母是 abaca,则该路径的权值为 3。请你找到给定图中权值最大的路径,输出这个最大路径权值。输入格式第一行包含两个整数 n 和 m。第二行包含一个由小写字母构成的字符串 s,其中第 i 个字母表示第 i 个点上的字母。接下来 m 行,每行包含两个整数 x,y 表示存在一条从点 x 到点 y 的边。所有点的编号原创 2022-05-22 14:52:52 · 578 阅读 · 0 评论 -
C++中求全排列地函数next_permutation()
简介next_permutation()会取得[first,last)所标示之序列的下一个排列组合,如果没有下一个排列组合,便返回false;否则返回true。这个算法有两个版本。其中常用的版本使用元素型别所提供的less-than操作符来决定下一个排列组合。这个全排列不仅仅支持里面无重复元素的全排列,也支持里面有重复元素的全排列,而且还支持字母的全排列。当然它还有一个孪生兄弟prev_permutation,是用来求它前一个排列的。用法一:求全排列#include <bits/stdc++.原创 2022-05-22 14:47:39 · 173 阅读 · 0 评论 -
中缀表达式求值
中缀表达式求值给定一个表达式,其中运算符仅包含 +,-,*,/(加 减 乘 整除),可能包含括号,请你求出表达式的最终值。注意:数据保证给定的表达式合法。题目保证符号 - 只作为减号出现,不会作为负号出现,例如,-1+2,(2+2)*(-(1+1)+2) 之类表达式均不会出现。题目保证表达式中所有数字均为正整数。题目保证表达式在中间计算过程以及结果中,均不超过 231−1。题目中的整除是指向 0 取整,也就是说对于大于 0 的结果向下取整,例如 5/3=1,对于小于 0 的结果向上取整,例如原创 2022-05-14 10:39:14 · 365 阅读 · 0 评论 -
2018年蓝桥杯C++A组第8题全球变暖
全球变暖你有一张某海域NxN像素的照片,".“表示海洋、”#"表示陆地,如下所示:….##….##……##.…####.…###.…其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。例如上图中的海域未来会变成如下样子:……………#………请你计算:依照科学家的预测,照片中有原创 2022-04-04 16:04:32 · 1001 阅读 · 0 评论 -
2018年蓝桥杯C++A组幸运数字
到x星球旅行的游客都被发给一个整数,作为游客编号。x星的国王有个怪癖,他只喜欢数字3,5和7。国王规定,游客的编号如果只含有因子:3,5,7,就可以获得一份奖品。前10个幸运数字是:3 5 7 9 15 21 25 27 35 45,因而第11个幸运数字是:49小明领到了一个幸运数字 59084709587505。去领奖的时候,人家要求他准确说出这是第几个幸运数字,否则领不到奖品。请你帮小明计算一下,59084709587505是第几个幸运数字。做过力扣丑数的人都知道这道题目可以用堆来做,.原创 2022-04-03 20:20:02 · 255 阅读 · 0 评论 -
2018年c++A组第三题末尾0的个数
给10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零?质因数分解可知道末尾0的个数取决于质因数分解2和5的个数,两者取最小值就行了。#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N=15;int g[N][N];int main(){ for(int i=0;i原创 2022-04-03 19:19:03 · 254 阅读 · 0 评论 -
2018蓝桥杯C++A组第二题星期六
星期六整个20世纪(1901年1月1日至2000年12月31日之间),一共有多少个星期一?翻一下日历,知道2000年12.31是周日,因次我们可以求出来总天数sum,结合sum/7和sum%7就可以求出来答案了#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;int main(){ int sum=0原创 2022-04-03 18:51:16 · 152 阅读 · 0 评论 -
2018年c++A组第一题
模拟题原创 2022-04-03 18:36:22 · 135 阅读 · 0 评论 -
2017年蓝桥杯c++A组方格分割
标题:方格分割6x6的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。如图:p1.png, p2.png, p3.png 就是可行的分割法。试计算:包括这3种分法在内,一共有多少种不同的分割方法。注意:旋转对称的属于同一种分割法。以开始做这道题目想的是用dfs对方格进行搜索,后来发现这样很难判断重复搜索的次数以及递归的出口,看了网上博客大佬们的解法才恍然大悟,原来可以直接对方格边缘的点进行搜索,由于每一次分割一定经过点(3,3),因此可以以这个边为起点进行搜索,同时标记对原创 2022-04-03 16:16:48 · 482 阅读 · 0 评论 -
第13届蓝桥杯模拟赛题解最后一题
问题描述 给定 n 个整数 a[1], a[2], …, a[n],小蓝希望在中间选出一部分,满足以下两个条件: 1. 对于某个下标集合 S,选出的数中有至少 k 个下标在集合 S 中; 2. 选出的数按照原来的顺序排列,是严格单调上升的,即选出的是一个上升子序列。 请问小蓝最多能选出多少个数。输入格式 输入的第一行包含两个整数 n, k,用一个空格分隔。 第二行包含 n 个整数 a[1], a[2], …, a[n],相邻的整数间用空格分隔。 第三行包含一个长度为 n 的0.原创 2022-04-03 15:41:46 · 270 阅读 · 0 评论 -
2017年蓝桥杯C++A组最大公共子串
最大公共子串最大公共子串长度问题就是:求两个串的所有子串中能够匹配上的最大长度是多少。比如:“abcdkkk” 和 “baabcdadabc”,可以找到的最长的公共子串是"abcd",所以最大公共子串长度为4。下面的程序是采用矩阵法进行求解的,这对串的规模不大的情况还是比较有效的解法。请分析该解法的思路,并补全划线部分缺失的代码。代码如下:#include <stdio.h> #include <string.h> #define N 256 int f(原创 2022-04-03 10:06:15 · 69 阅读 · 0 评论 -
第12届蓝桥杯C++A组第6题字母组串
字母组串由 A,B,C 这3个字母就可以组成许多串。比如:“A”,“AB”,“ABC”,“ABA”,“AACBB” …现在,小明正在思考一个问题:如果每个字母的个数有限定,能组成多少个已知长度的串呢?他请好朋友来帮忙,很快得到了代码,解决方案超级简单,然而最重要的部分却语焉不详。请仔细分析源码,填写划线部分缺少的内容。#include <iostream>#include <cstring>#include <cstdio>#include <原创 2022-04-03 09:57:25 · 420 阅读 · 0 评论 -
2017年蓝桥杯c++A组第一题走迷宫
走迷宫题目描述:X星球的一处迷宫游乐场建在某个小山坡上。它是由10x10相互连通的小房间组成的。房间的地板上写着一个很大的字母。我们假设玩家是面朝上坡的方向站立,则:L表示走到左边的房间,R表示走到右边的房间,U表示走到上坡方向的房间,D表示走到下坡方向的房间。X星球的居民有点懒,不愿意费力思考。他们更喜欢玩运气类的游戏。这个游戏也是如此!开始的时候,直升机把100名玩家放入一个个小房间内。玩家一定要按照地上的字母移动。迷宫地图如下:请你计算一下,最后,有多少玩家会走出迷宫? 而不是在原创 2022-04-02 20:51:16 · 2828 阅读 · 0 评论 -
蓝乔杯真题四平方和
四平方和四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多 4 个正整数的平方和。如果把 0 包括进去,就正好可以表示为 4 个数的平方和。比如:5=02+02+12+227=12+12+12+22对于一个给定的正整数,可能存在多种平方和的表示法。要求你对 4 个数排序:0≤a≤b≤c≤d并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法。输入格式输入一个正整数 N。输出格式输出4个非负整数,按从小到大排序,中间用空格分开。数据范围0&原创 2022-01-14 13:02:45 · 116 阅读 · 0 评论 -
栈的应用之表达式求值
表达式求值给定一个表达式,其中运算符仅包含 +,-,*,/(加 减 乘 整除),可能包含括号,请你求出表达式的最终值。注意:数据保证给定的表达式合法。题目保证符号 - 只作为减号出现,不会作为负号出现,例如,-1+2,(2+2)*(-(1+1)+2) 之类表达式均不会出现。题目保证表达式中所有数字均为正整数。题目保证表达式在中间计算过程以及结果中,均不超过 231−1。题目中的整除是指向 0 取整,也就是说对于大于 0 的结果向下取整,例如 5/3=1,对于小于 0 的结果向上取整,例如 5/原创 2022-01-09 21:34:00 · 59 阅读 · 0 评论 -
区间合并算法
区间合并给定 n 个区间 [li,ri],要求合并所有有交集的区间。注意如果在端点处相交,也算有交集。输出合并完成后的区间个数。例如:[1,3] 和 [2,6] 可以合并为一个区间 [1,6]。输入格式第一行包含整数 n。接下来 n 行,每行包含两个整数 l 和 r。输出格式共一行,包含一个整数,表示合并区间完成后的区间个数。数据范围1≤n≤100000,−109≤li≤ri≤109输入样例:51 22 45 67 87 9输出样例:3#include <i原创 2022-01-05 12:37:36 · 72 阅读 · 0 评论 -
二进制中1的个数
二进制中1的个数给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1 的个数。输入格式第一行包含整数 n。第二行包含 n 个整数,表示整个数列。输出格式共一行,包含 n 个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中 1 的个数。数据范围1≤n≤100000,0≤数列中元素的值≤109输入样例:51 2 3 4 5输出样例:1 1 2 1 2#include<iostream>#include<cstring>#inc原创 2022-01-04 19:48:43 · 576 阅读 · 0 评论 -
浮点数二分模板题
数字的三次方根给定一个浮点数 n,求它的三次方根。输入格式共一行,包含一个浮点数 n。输出格式共一行,包含一个浮点数,表示问题的解。注意,结果保留 6 位小数。数据范围−10000≤n≤10000输入样例:1000.00输出样例:10.000000#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;原创 2022-01-03 11:46:00 · 176 阅读 · 0 评论 -
整数二分模板题
数的范围给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。如果数组中不存在该元素,则返回 -1 -1。输入格式第一行包含整数 n 和 q,表示数组长度和询问个数。第二行包含 n 个整数(均在 1∼10000 范围内),表示完整数组。接下来 q 行,每行包含一个整数 k,表示一个询问元素。输出格式共 q 行,每行包含两个整数,表示所求元素的起始位置和终止位置。如果数组中不存在该元素,则返回 -1 -原创 2022-01-03 11:09:53 · 60 阅读 · 0 评论 -
归并算法模板
归并排序给定你一个长度为 n 的整数数列。请你使用归并排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数 n。第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整个数列。输出格式输出共一行,包含 n 个整数,表示排好序的数列。数据范围1≤n≤100000输入样例:53 1 2 4 5输出样例:1 2 3 4 5#include<iostream>#include<cstdio>#incl原创 2022-01-02 14:15:03 · 53 阅读 · 0 评论 -
python和C++详解八数码问题
845. 八数码在一个 3×3 的网格中,1∼8 这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3 的网格中。例如:1 2 3x 4 67 5 8在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):1 2 34 5 67 8 x例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下:1 2 3 1 2 3 1 2 3 1 2 3x原创 2021-12-28 20:49:55 · 237 阅读 · 0 评论 -
只算出最短路径的走迷宫
844. 走迷宫给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1 表示不可通过的墙壁。最初,有一个人位于左上角 (1,1) 处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。请问,该人从左上角移动至右下角 (n,m) 处,至少需要移动多少次。数据保证 (1,1) 处和 (n,m) 处的数字为 0,且一定至少存在一条通路。输入格式第一行包含两个整数 n 和 m。接下来 n 行,每行包含 m 个整数(0 或 1),表示完整的二维原创 2021-12-23 17:47:27 · 135 阅读 · 0 评论 -
由全排列问题引来的八数码问题
n皇后问题n−皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。现在给定整数 n,请你输出所有的满足条件的棋子摆法。输入格式共一行,包含整数 n。输出格式每个解决方案占 n 行,每行输出一个长度为 n 的字符串,用来表示完整的棋盘状态。其中 . 表示某一个位置的方格状态为空,Q 表示某一个位置的方格上摆着皇后。每个方案输出完成后,输出一个空行。注意:行末不能有多余空格。输出方案的顺序任意,只要不重复且没原创 2021-12-23 13:36:54 · 65 阅读 · 0 评论 -
dfs打印组合数
#include#include#include#includeusing namespace std;#define N 27int n,m;int a[N];bool st[N];void dfs(int v){if(v>m){for(int i=1;i<=m;i++){cout<<a[i]<<’ ';}cout<<endl;return ;}for(int i=1;i<=n;i++){if(!st[i]&原创 2021-12-16 21:40:18 · 77 阅读 · 0 评论 -
费解的开关
95. 费解的开关你玩过“拉灯”游戏吗?25 盏灯排成一个 5×5 的方形。每一个灯都有一个开关,游戏者可以改变它的状态。每一步,游戏者可以改变某一个灯的状态。游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。我们用数字 1 表示一盏开着的灯,用数字 0 表示关着的灯。下面这种状态1011101101101111000011011在改变了最左上角的灯的状态后将变成:0111111101101111000011011再改变它正中间的灯后状原创 2021-12-16 19:44:05 · 94 阅读 · 0 评论 -
递归实现全排列性质的枚举
把 1∼n 这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序。输入格式一个整数 n。输出格式按照从小到大的顺序输出所有方案,每行 1 个。首先,同一行相邻两个数用一个空格隔开。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。数据范围1≤n≤9输入样例:3输出样例:1 2 31 3 22 1 32 3 13 1 23 2 1难度:简单时/空限制:5s / 256MB用递归来枚举全排列的话,可以有两种考虑方式,一种是考虑第几个位置放置哪些数字,原创 2021-12-16 12:56:24 · 106 阅读 · 0 评论 -
递归实现指数性质组合枚举
从 1∼n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。输入格式输入一个整数 n。输出格式每行输出一种方案。同一行内的数必须升序排列,相邻两个数用恰好 1 个空格隔开。对于没有选任何数的方案,输出空行。本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。数据范围1≤n≤15输入样例:3输出样例:322 311 31 21 2 3难度:简单时/空限制:5s / 256MB#include<cstring>#include<原创 2021-12-16 12:35:25 · 969 阅读 · 0 评论 -
Dijkstra求最短路 I
Dijkstra求最短路 I给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为正值。请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1。输入格式第一行包含整数 n 和 m。接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。输出格式输出一个整数,表示 1 号点到 n 号点的最短距离。如果路径不存在,则输出 −1。数据范围1≤n≤500,1≤m≤105,图中涉及边长均不超过10原创 2021-12-12 21:54:04 · 596 阅读 · 1 评论 -
bfs求最短路径之抓住那头牛
1100. 抓住那头牛农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点 N,牛位于点 K。农夫有两种移动方式:从 X 移动到 X−1 或 X+1,每次移动花费一分钟从 X 移动到 2∗X,每次移动花费一分钟假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?输入格式共一行,包含两个整数N和K。输出格式输出一个整数,表示抓到牛所花费的最少时间。数据范围0≤N,K≤105输入样例:5 17输出样例:4难度:简单时/空限制:1s /原创 2021-12-11 17:34:33 · 233 阅读 · 0 评论 -
武士风度的牛
bfs解决起点到终点的最短路径问题----经典算法原创 2021-12-10 17:19:04 · 144 阅读 · 0 评论 -
迷宫问题2打印出迷宫其中的一条最短路径
迷宫问题2给定一个 n×n 的二维数组,如下所示:int maze[5][5] = {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,};它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。数据保证至少存在一条从左上角走到右下角的路径。输入格式第一行包含整数 n。接下来 n 行,每行包含 n 个整数 0 或 1,表示迷原创 2021-12-09 12:44:40 · 419 阅读 · 0 评论 -
池塘计数------bfs求连通块的个数
池塘计数农夫约翰有一片 N∗M 的矩形土地。最近,由于降雨的原因,部分土地被水淹没了。现在用一个字符矩阵来表示他的土地。每个单元格内,如果包含雨水,则用”W”表示,如果不含雨水,则用”.”表示。现在,约翰想知道他的土地中形成了多少片池塘。每组相连的积水单元格集合可以看作是一片池塘。每个单元格视为与其上、下、左、右、左上、右上、左下、右下八个邻近单元格相连。请你输出共有多少片池塘,即矩阵中共有多少片相连的”W”块。输入格式第一行包含两个整数 N 和 M。接下来 N 行,每行包含 M 个字原创 2021-12-08 19:52:09 · 376 阅读 · 0 评论 -
不同路径2
不同路径2不同路径 II一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。示例 1:输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]输出:2解释:3x3 网格的正中间有一个障碍物。从左上角到右下原创 2021-11-16 14:33:15 · 101 阅读 · 0 评论