![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++算法
算法
weixin_51160138
这个作者很懒,什么都没留下…
展开
-
[蓝桥杯2018初赛]第几个幸运数
到x星球旅行的游客都被发给一个整数,作为游客编号。x星的国王有个怪癖,他只喜欢数字3,5和7。国王规定,游客的编号如果只含有因子:3,5,7,就可以获得一份奖品。前10个幸运数字是:3 5 7 9 15 21 25 27 35 45,因而第11个幸运数字是:49小明领到了一个幸运数字 59084709587505。去领奖的时候,人家要求他准确说出这是第几个幸运数字,否则领不到奖品。请你帮小明计算一下,59084709587505是第几个幸运数字。枚举每一个数,然后再判断,会超时,运行不出来;我原创 2021-04-17 10:08:29 · 133 阅读 · 0 评论 -
[蓝桥杯2020决赛]扩散
小蓝在一张无限大的特殊画布上作画。这张画布可以看成一个方格图,每个格子可以用一个二维的整数坐标表示。小蓝在画布上首先点了一下几个点:(0, 0), (2020, 11), (11, 14), (2000, 2000)。只有这几个格子上有黑色,其它位置都是白色的。每过一分钟,黑色就会扩散一点。具体的,如果一个格子里面是黑色,它就会扩散到上、下、左、右四个相邻的格子中,使得这四个格子也变成黑色(如果原来就是黑色,则还是黑色)。请问,经过 2020 分钟后,画布上有多少个格子是黑色的。①bfs解原创 2021-04-14 17:28:59 · 317 阅读 · 0 评论 -
[蓝桥杯2017初赛]纸牌三角形
A,2,3,4,5,6,7,8,9 共9张纸牌排成一个正三角形(A按1计算)。要求每个边的和相等。下图就是一种排法这样的排法可能会有很多。如果考虑旋转、镜像后相同的算同一种,一共有多少种不同的排法呢?输出输出一个整数表示答案思路:对9个数全排列,注意去重(翻转3次,镜像2次)#include <iostream>#include <algorithm>using namespace std;int a[9] = {1,2,3,4,5,6,7,8,9};bool原创 2021-04-14 16:00:03 · 86 阅读 · 0 评论 -
[蓝桥杯2017初赛]九宫幻方
小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分。三阶幻方指的是将1~9不重复的填入一个33的矩阵当中,使得每一行、每一列和每一条对角线的和都是相同的。三阶幻方又被称作九宫格,在小学奥数里有一句非常有名的口诀:“二四为肩,六八为足,左三右七,戴九履一,五居其中”,通过这样的一句口诀就能够非常完美的构造出一个九宫格来。4 9 23 5 78 1 6有意思的是,所有的三阶幻方,都可以通过这样一个九宫格进行若干镜像和旋转操作之后得到。现在小明准备将一个三阶幻方(不一定是上图原创 2021-04-11 11:06:08 · 141 阅读 · 0 评论 -
[蓝桥杯2017初赛]承压计算
X星球的高科技实验室中整齐地堆放着某批珍贵金属原料。每块金属原料的外形、尺寸完全一致,但重量不同。金属材料被严格地堆放成金字塔形。其中的数字代表金属块的重量(计量单位较大)。(参考输入中的金字塔)最下一层的X代表30台极高精度的电子秤。假设每块原料的重量都十分精确地平均落在下方的两个金属块上,最后,所有的金属块的重量都严格精确地平分落在最底层的电子秤上。电子秤的计量单位很小,所以显示的数字很大。工作人员发现,其中读数最小的电子秤的示数为:2086458231请你推算出:读数最大的电子秤的示原创 2021-04-09 20:39:14 · 280 阅读 · 0 评论 -
[蓝桥杯2017初赛]等差素数列
2,3,5,7,11,13,…是素数序列。类似:7,37,67,97,127,157 这样全由素数组成的等差数列,叫等差素数数列。上边的数列公差为30,长度为6。2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。这是数论领域一项惊人的成果!有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:长度为10的等差素数列,其公差最小值是多少?思路:因为这题是填空题,求长度为10的等差素数列,猜想最大的数应该不会超过10000,因此先枚举2~10000每个数,判断一下是否是素数;先原创 2021-04-09 19:32:19 · 142 阅读 · 0 评论 -
[蓝桥杯2017初赛]方格分割
6x6的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。如图就是可行的分割法。试计算:包括这3种分法在内,一共有多少种不同的分割方法。注意:旋转对称的属于同一种分割法。输出一个整数表示答案由上图可以看到分界线上的点关于(3,3)对称,因此,从(3,3)这个点向上下左右四个方向搜索,在搜索的时候将其关于(3,3)对称的点也标记成搜素过,这样在搜索到出口时,得到的图形就是对称的,注意上下和左右方向是对称的,在搜的时候会重复计算,因此得到的结果/4#include <iostrea原创 2021-04-09 13:55:34 · 80 阅读 · 0 评论 -
[蓝桥杯2017初赛]青蛙跳杯子
X 星球的流行宠物是青蛙,一般有两种颜色:白色和黑色。X 星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去。如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙。*WWWBBB其中,W 字母表示白色青蛙,B 字母表示黑色青蛙,* 表示空杯子。X 星的青蛙很有些癖好,它们只做 3 个动作之一:跳到相邻的空杯子里。隔着 1 只其它的青蛙(随便什么颜色)跳到空杯子里。隔着 2 只其它的青蛙(随便什么颜色)跳到空杯子里。对于上图的局面,只要 1 步,就可跳成下图局面原创 2021-04-09 10:31:43 · 227 阅读 · 0 评论 -
[蓝桥杯2017初赛]跳蚱蜢
如图所示: 有9只盘子,排成1个圆圈。其中8只盘子内装着8只蚱蜢,有一个是空盘。我们把这些蚱蜢顺时针编号为 1~8。每只蚱蜢都可以跳到相邻的空盘中,也可以再用点力,越过一个相邻的蚱蜢跳到空盘中。请你计算一下,如果要使得蚱蜢们的队形改为按照逆时针排列,并且保持空盘的位置不变(也就是1-8换位,2-7换位,…),至少要经过多少次跳跃?输出一个整数表示答案思路:...原创 2021-04-09 10:16:08 · 146 阅读 · 0 评论 -
八数码(bfs)
在一个 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 4 6 4原创 2021-04-08 14:04:37 · 197 阅读 · 0 评论 -
[蓝桥杯2016初赛]交换瓶子
有 N 个瓶子,编号 1∼N,放在架子上。比如有 5 个瓶子:2 1 3 5 4要求每次拿起 2 个瓶子,交换它们的位置。经过若干次后,使得瓶子的序号为:1 2 3 4 5对于这么简单的情况,显然,至少需要交换 2 次就可以复位。如果瓶子更多呢?你可以通过编程来解决。输入格式第一行包含一个整数 N,表示瓶子数量。第二行包含 N 个整数,表示瓶子目前的排列状况。输出格式输出一个正整数,表示至少交换多少次,才能完成排序。数据范围1≤N≤10000,输入样例1:53 1 2 5原创 2021-04-08 09:53:18 · 85 阅读 · 0 评论 -
[蓝桥杯2016初赛]剪邮票
如下图, 有12张连在一起的12生肖的邮票。现在你要从中剪下5张来,要求必须是连着的。(仅仅连接一个角不算相连)比如,下面两张图中,粉红色所示部分就是合格的剪取。请你计算,一共有多少种不同的剪取方法。输出请填写表示方案数目的整数。思路:总共有12个格子,可以先用一个一维数组来表示这12个格子,分为7个0和5个1,然后对这12个格子进行全排列。再将这12个格子映射到二维数组中去,对格子是1的进行dfs,判断格子是1的是否能形成一个连通块,如果可以形成,那么答案++这里对12个格子的全排列提原创 2021-04-06 20:06:33 · 73 阅读 · 0 评论 -
[蓝桥杯2016初赛]寒假作业
现在小学的数学题目也不是那么好玩的。看看这个寒假作业:每个方块代表1~13中的某一个数字,但不能重复。比如:6 + 7 = 139 - 8 = 13 * 4 = 1210 / 2 = 5以及:7 + 6 = 139 - 8 = 13 * 4 = 1210 / 2 = 5就算两种解法。(加法,乘法交换律后算不同的方案)你一共找到了多少种方案?输出请填写表示方案数目的整数。直接枚举1~13,13个数的全排列会超时,因此再dfs时剪枝,当枚举的四个表达式有一个不满足要原创 2021-04-04 20:51:41 · 93 阅读 · 0 评论 -
[蓝桥杯2016初赛]方格填数
如下的10个格子,填入0~9的数字。要求:连续的两个数字不能相邻。(左右、上下、对角都算相邻)一共有多少种可能的填数方案?输出请填写表示方案数目的整数。#include <iostream>#include <algorithm>using namespace std;int a[10] = {0,1,2,3,4,5,6,7,8,9};int res;bool st[10];bool check(){ if ( abs(a[0] - a[原创 2021-04-04 20:01:05 · 75 阅读 · 0 评论 -
[蓝桥杯2015初赛]加法变乘法
我们都知道:1+2+3+ … + 49 = 1225现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015比如:1+2+3+…+1011+12+…+2728+29+…+49 = 2015 就是符合要求的答案。请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交。(对于示例,就是提交10)。#include <iostream>using namespace std;int main(){ for (int i = 1 ; i <= 46 ; i原创 2021-04-04 11:48:17 · 92 阅读 · 0 评论 -
[蓝桥杯2015初赛]三羊献瑞
观察下面的加法算式:其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。输出请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。每个相同的汉字代表相同的数字,这些数字都是在0~9中选, 因此可以枚举所有的数字,对于每一位进行选择,使用STL全排列函数#include <iostream>#include <algorithm>using namespace std;原创 2021-04-04 11:05:29 · 111 阅读 · 0 评论 -
[蓝桥杯2015初赛]手链样式
小明有3颗红珊瑚,4颗白珊瑚,5颗黄玛瑙。他想用它们串成一圈作为手链,送给女朋友。现在小明想知道:如果考虑手链可以随意转动或翻转,一共有多少不同的组合样式?输出请你输出该整数。不要输出任何多余的内容或说明性的文字。思路:首先枚举字符串s的全排列;去掉重复排列(转动和翻转),这里复制一下字符串,存入vector数组中,再翻转复制后的字符串,存入vector数组中,如果枚举字符串s的的排列中,是存入vector中字符串的子串,说明重复,break#include <iostream>原创 2021-04-03 19:37:35 · 62 阅读 · 0 评论 -
unordered_set || unordered_map
unordered_set:自动删除重复元素,使得集合内元素各不相同 unordered_set<int> q; q.insert(1); q.insert(2); q.insert(1); q.insert(1); q.insert(1); cout << q.size() << endl; // 2 q.erase(1); q.find(1);unordered_set是一个集合,有的时原创 2021-04-02 18:34:28 · 83 阅读 · 0 评论 -
求最大公约数,__gcd()函数
手写递归版本int gcd(int a, int b){ if (b == 0) return a; return gcd(b , a % b);}直接调用函数__gcd(a,b);原创 2021-04-02 14:22:47 · 152 阅读 · 0 评论 -
算法:第k个数
快排给定一个长度为n的整数数列,以及一个整数k,请用快速选择算法求出数列的第k小的数是多少。原题链接#include <iostream>using namespace std;const int N = 100010;int n , k;int q[N];void quick_sort(int q[], int l , int r){ if(l >= r) return; int x = q[ l + r >> 1 ]; int i原创 2021-01-23 21:02:27 · 82 阅读 · 0 评论 -
算法:快速排序
快排属于分治算法:①确定分界点 x,分成子问题;②递归处理子问题;③子问题合并(快排这一步不需要操作,但归并排序的核心在这一步骤)时间复杂度O(nlogn);题目链接#include <iostream>using namespace std;const int N = 100010;int n;int q[N];void quick_sort(int q[] , int l , int r){ if (l >= r) return; //l左边界,r有边原创 2021-01-23 20:35:04 · 61 阅读 · 0 评论 -
C++:位运算
C++提供了六种位运算符,来进行了位运算操作:----------------- &-------------->按位与(双目)----------------- |--------------->按位或 (双目)-----------------^-------------->按位异或(双目)-----------------~-------------->按位非(取反\单目)-----------------<<-------------->原创 2021-02-05 16:04:44 · 251 阅读 · 0 评论 -
带分数(第四届蓝桥杯省赛C++B/C组,第四届蓝桥杯省赛JAVAA/B组)
100 可以表示为带分数的形式:100=3+69258714还可以表示为:100=82+3546197注意特征:带分数中,数字 1∼9 分别出现且只出现一次(不包含 0)。类似这样的带分数,100 有 11 种表示法。输入格式一个正整数。输出格式输出输入数字用数码 1∼9 不重复不遗漏地组成带分数表示的全部种数。数据范围1≤N<106输入样例1:100输出样例1:11输入样例2:105输出样例2:6**思路:*暴力枚举出9个数全排列。用一个数组保存全排列的结果;原创 2021-02-04 17:40:22 · 134 阅读 · 0 评论 -
算法:递归实现组合型枚举
从 1~n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案。输入格式两个整数 n,m ,在同一行用空格隔开。输出格式按照从小到大的顺序输出所有方案,每行1个。首先,同一行内的数升序排列,相邻两个数用一个空格隔开。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如1 3 5 7排在1 3 6 8前面)。数据范围n>0 ,0≤m≤n ,n+(n−m)≤25输入样例:5 3输出样例:1 2 31 2 41 2 51 3 41 3 51 4原创 2021-02-04 11:35:03 · 140 阅读 · 0 评论 -
算法:非递归STL实现排列型枚举
把 1~n 这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序。输入格式一个整数n。输出格式按照从小到大的顺序输出所有方案,每行1个。首先,同一行相邻两个数用一个空格隔开。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。数据范围1≤n≤9输入样例:3输出样例:1 2 31 3 22 1 32 3 13 1 23 2 1#include <bits/stdc++.h>using namespace std;const int N =原创 2021-02-04 11:19:28 · 66 阅读 · 0 评论 -
算法:STL全排列next_permutation()函数的用法
int a[];do{}while( next_permutation(a , a + n);#include <bits/stdc++.h>using namespace std;int n;int main(){ int a[4] ={1,3,2}; sort( a ,a + 3); do { for(int i = 0;i<3 ;i++) cout<<a[i]<<" "; puts(""); }w原创 2021-02-04 11:17:53 · 59 阅读 · 0 评论 -
算法:递归实现排列型枚举
把 1~n 这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序。输入格式一个整数n。输出格式按照从小到大的顺序输出所有方案,每行1个。首先,同一行相邻两个数用一个空格隔开。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。数据范围1≤n≤9输入样例:3输出样例:1 2 31 3 22 1 32 3 13 1 23 2 1#include <bits/stdc++.h>using namespace std;const int N =原创 2021-02-04 10:56:25 · 55 阅读 · 0 评论 -
算法:递归实现指数型枚举
从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。输入格式输入一个整数n。输出格式每行输出一种方案。同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。对于没有选任何数的方案,输出空行。本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。数据范围1≤n≤15输入样例:3输出样例:322 311 31 21 2 3#include <bits/stdc++.h>using namespace std;const int原创 2021-02-04 10:51:18 · 93 阅读 · 0 评论 -
蓝桥杯题目C++
1250: [蓝桥杯2015初赛]方程整数解#include <bits/stdc++.h>using namespace std;int n;int main(){ int flag; while(cin>>n) { flag =0; for(int a = 1 ;a <= n ;++a) for(int b = a ; a*a+b*b<= n ; ++b ) for(int c = b ; a*a+b*b+c*c原创 2021-02-01 21:17:24 · 101 阅读 · 0 评论 -
bfs算法:844. 走迷宫 (打印路径)
给定一个n*m的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以走的路,1表示不可通过的墙壁。最初,有一个人位于左上角(1, 1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。请问,该人从左上角移动至右下角(n, m)处,至少需要移动多少次。数据保证(1, 1)处和(n, m)处的数字为0,且一定至少存在一条通路。输入格式第一行包含两个整数n和m。接下来n行,每行包含m个整数(0或1),表示完整的二维数组迷宫。输出格式输出一个整数,表示从左上角移动至右下角的原创 2021-01-30 21:33:25 · 331 阅读 · 0 评论 -
C++ pair 用法总结
pair是将2个数据组合成一组数据,当需要这样的需求时就可以使用pair,如STL中的map就是将key和value放在一起来保存。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。 pair的实现是一个结构体,主要的两个成员变量是first second 因为是使用struct不是class,所以可以直接使用pair的成员变量。使用pair比定义一个结构体节省了代码,并且pair可以做比较运算;pair<T1, T2> p1; //创建一个空的pair原创 2021-01-29 11:59:35 · 328 阅读 · 1 评论 -
C++ memset()函数
#include <bits/stdc++.h>using namespace std;int d[10];int main(){ memset(d,-1,sizeof(d)); for(int i = 0 ; i < 10; i++) { cout << d[i] << endl; } return 0;}输出如下:memset这个函数的作用是将数字以单个字节逐个拷贝的方式放..原创 2021-01-29 11:44:33 · 159 阅读 · 0 评论 -
C++万能头文件:#include <bits/stdc++.h>
#include<bits/stdc++.h>包含了目前c++所包含的所有头文件!!!!从此开启开挂般的人生啊!!现在再看下面这一堆乱七八糟的头文件显得莫名的冗杂:#include <iostream>#include <cstdio>#include <fstream>#include <algorithm>#include <cmath>#include <deque>#include <vect原创 2021-01-29 11:27:22 · 369 阅读 · 0 评论 -
dfs算法:皇后问题(按每个元素搜索)
n-皇后问题是指将 n 个皇后放在 n∗n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。现在给定整数n,请你输出所有的满足条件的棋子摆法。输入格式共一行,包含整数n。输出格式每个解决方案占n行,每行输出一个长度为n的字符串,用来表示完整的棋盘状态。其中”.”表示某一个位置的方格状态为空,”Q”表示某一个位置的方格上摆着皇后。每个方案输出完成后,输出一个空行。输出方案的顺序任意,只要不重复且没有遗漏即可。数据范围1≤n≤9输入样例:4原创 2021-01-27 21:15:41 · 113 阅读 · 2 评论 -
dfs算法:843. n-皇后问题
n-皇后问题是指将 n 个皇后放在 n∗n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。现在给定整数n,请你输出所有的满足条件的棋子摆法。输入格式共一行,包含整数n。输出格式每个解决方案占n行,每行输出一个长度为n的字符串,用来表示完整的棋盘状态。其中”.”表示某一个位置的方格状态为空,”Q”表示某一个位置的方格上摆着皇后。每个方案输出完成后,输出一个空行。输出方案的顺序任意,只要不重复且没有遗漏即可。数据范围1≤n≤9输入样例:4原创 2021-01-27 20:30:10 · 144 阅读 · 0 评论 -
dfs算法:842. 排列数字
给定一个整数n,将数字1~n排成一排,将会有很多种排列方法。现在,请你按照字典序将所有的排列方法输出。输入格式共一行,包含一个整数n。输出格式按字典序输出所有排列方案,每个方案占一行。数据范围1≤n≤7输入样例:3输出样例:1 2 31 3 22 1 32 3 13 1 23 2 1注意点:①定义一个path[ ]数组,用来保存路径;②定义一个bool类型的skt[ ]数组,用来判断当前路径能不能走,是否已经被走过;③回溯完要返回现场;**回溯的特征是:**递归的原创 2021-01-27 20:12:20 · 106 阅读 · 0 评论 -
高精度算法:791. 高精度加法
给定两个正整数,计算它们的和。输入格式共两行,每行包含一个整数。输出格式共一行,包含所求的和。数据范围1≤整数长度≤100000输入样例:1223输出样例:35注意点:1.两个整数较大,用字符串来存,这样的话,可以调用它的size()方法2.将两个大的整数,存入vector数组中,最好把整数倒着存进vector数组中去这样,可以调用vector中的push_back()方法3.a-‘0’; 这样可以将一个字符转换成数字#include <iostream>#i原创 2021-01-26 21:50:35 · 106 阅读 · 0 评论 -
浮点数二分算法:790. 数的三次方根
给定一个浮点数n,求它的三次方根。输入格式共一行,包含一个浮点数n。输出格式共一行,包含一个浮点数,表示问题的解。注意,结果保留6位小数。数据范围−10000≤n≤10000输入样例:1000.00输出样例:10.000000经验值:当结果保留6位小数时,r-l = 1e-8;当结果保留5位小数时,r-l = 1e-7;往后多开两位#include <iostream>using namespace std;int main(){ double x原创 2021-01-26 21:06:12 · 160 阅读 · 0 评论 -
‘整数二分’ 算法:数的范围
给定一个按照升序排列的长度为n的整数数组,以及 q 个查询。对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。如果数组中不存在该元素,则返回“-1 -1”。输入格式第一行包含整数n和q,表示数组长度和询问个数。第二行包含n个整数(均在1~10000范围内),表示完整数组。接下来q行,每行包含一个整数k,表示一个询问元素。输出格式共q行,每行包含两个整数,表示所求元素的起始位置和终止位置。如果数组中不存在该元素,则返回“-1 -1”。数据范围1≤n≤1000001≤原创 2021-01-25 20:46:09 · 84 阅读 · 0 评论 -
算法:逆序对的数量
给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。输入格式第一行包含整数n,表示数列的长度。第二行包含 n 个整数,表示整个数列。输出格式输出一个整数,表示逆序对的个数。数据范围1≤n≤100000输入样例:62 3 4 5 6 1输出样例:5思路利用归并排序将可能的情况分成三种①左半边数组逆序对的数量:merge_sort原创 2021-01-24 21:18:04 · 396 阅读 · 0 评论