![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
蓝桥杯
文章平均质量分 65
卷心菜不卷Iris
你一定会成为你想要成为的人
展开
-
递归算法的应用
递归算法的应用递归实现排列型枚举题目描述核心思路可以用递归算法来求解,也可以用STL中的next_permutation函数枚举时,有两种情况:【1】枚举每个位置该放哪个数 这种情况可以保证按照字典序从小到大输出全排列 对于需要按字典序从小大的题目,只能用这种写法了【2】枚举每个数该放到哪个位置 这种情况并不能保证按照字典序从小到大输出全排列 对于需要按照字典序从小大的题目,就不能用这种写法了来分析第一种情况:枚举当前位置原创 2021-04-12 21:12:17 · 270 阅读 · 0 评论 -
乘积最大
乘积最大题目描述核心思路这里主要是要进行分类讨论。有两种大情况,k==nk==nk==n和k<nk<nk<n。对于k==nk==nk==n,比较好做,就是全选了这个序列中的nnn个数嘛。这里主要分析当k<nk<nk<n的情况:当kkk是偶数时,那么选出来的数相乘的结果肯定是非负数,原因如下:如果序列中负数的个数是偶数个,因为负负得正,那么我肯定能从序列中选出偶数个负数来相乘,假设选出了aaa个偶数,然后选出了k−ak-ak−a个非负数来相乘,总的结果是非原创 2021-03-31 19:32:39 · 100 阅读 · 0 评论 -
交换瓶子
交换瓶子题目描述核心思路初始情况分析:交换1个环中的任意两个结点后的情况分析:交换不同环中的两个结点的情况分析:有n个瓶子,那么最终要使得这n个瓶子都是自环。设最初题目输入的瓶子所形成的环的个数是cnt个,那么我们只需要做n−cntn-cntn−cnt次操作,就可以得到n个自环了。因此,只要求出题目输入的原始瓶子能形成的环的个数cnt,然后用n-cnt就是最少的交换次数了。问题:如何理解j=a[j]呢?代码#include<iostream>using原创 2021-03-29 21:59:11 · 122 阅读 · 0 评论 -
全球变暖
全球变暖题目描述核心思路这题通过题意描述,可以知道需要运用Flood Fill 算法来解决。 题目要求有多少个岛屿会被淹没。题目中的岛屿其实就是连通块。我们通过用Flood Fill 算法,可以很容易求出连通块的个数,也就是求出岛屿的个数,但是题目并不是要求有多少个岛屿。我们可以在用Flood Fill 算求连通块的过程中,求出当前这个连通内的土地的总数,设为total,同时求出这个连通块内有多少个土地是与海洋相连的,即淹没量,设为bound。这里观察出一个性质:当一个连通块内的土地总量total原创 2021-03-27 19:05:44 · 73 阅读 · 0 评论 -
地牢大师
地牢大师题目描述核心思路这题就是经典的bfs问题,但是我们平时遇到的都是二维,而这里是三维。思路大体上跟二维是一样的,只不过需要定义三个方向的偏移量数组dx,dy,dzdx,dy,dzdx,dy,dz。xxx轴方向的变化:(1,0,0)(1,0,0)(1,0,0)或者(−1,0,0)(-1,0,0)(−1,0,0)yyy轴方向的变化:(0,1,0)(0,1,0)(0,1,0)或者(0,−1,0)(0,-1,0)(0,−1,0)zzz轴方向的变化:(0,0,1)(0,0,1)(0,0,1)或原创 2021-03-27 18:03:07 · 119 阅读 · 0 评论 -
完全二叉树的权值
完全二叉树的权值题目描述核心思路代码#include<iostream>using namespace std;typedef long long LL;const int N=100010;int n;int a[N];int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); int depth=-0; //最小的深度原创 2021-03-26 21:15:04 · 63 阅读 · 0 评论 -
日志统计
日志统计题目描述核心思路典型的固定大小窗口问题,只需要用双指针移动即可。把所有日志按照时间先后顺序排序,然后利用双指针法,维护一个长度为D但是窗口的大小应该是D-1(因为是左闭右开)的区间,当存在点赞数大于等于 K 的帖子时,就将它记录下来。i指针在前面跑,j指针在后面追。如果j指针所指向的内容以及划出了窗口,则将左指针所指向的id帖子的点赞取消,然后让j指针指向下一个,之后再右移i指针,再将当前右指针所指时刻被点赞的帖子id加上相应的点赞。我们用一个数组cnt来用来记录一个id号获得的赞数。当原创 2021-03-26 18:48:26 · 296 阅读 · 0 评论 -
错误票据
错误票据题目描述核心思路先把所有数据排序,如果相邻的两个数相差大于1,则说明有断号,比如a[i−1]=6a[i-1]=6a[i−1]=6,a[i]=8a[i]=8a[i]=8,那么就说明有断号,而断号就是a[i]−1=8−1=7a[i]-1=8-1=7a[i]−1=8−1=7。如果相邻的两个数是相同的,则说明有重号,比如a[i−1]==a[i]a[i-1]==a[i]a[i−1]==a[i]。这里的难点不在于解题思路,而在于怎么处理输入。题目并没有说明一行要输入多少个数。一般,对于没有具体说明原创 2021-03-25 19:57:51 · 127 阅读 · 0 评论 -
连号区间数
连号区间数题目描述样例解释对于第一个样例:长度为1,那么有{3},有{2},有{4},有{1}。因此满足要求的有4个长度为2,那么对于{3,2},排序后就是{2,3}满足要求;对于{2,4},它少了3,不满足;对于{4,1},排序后为{1,4}少了2,3不满足。因此满足要求的有1个。长度为3,那么对于{3,2,4},排序后为{2,3,4}满足要求;对于{2,4,1},排序后为{1,2,4}不满足,它少了3。因此满足要求的有1个。长度为4,那么对于{3,2,4,1},排序后为{1,2,3,原创 2021-03-25 19:56:49 · 109 阅读 · 0 评论 -
递增三元组
递增三元组题目描述核心思路解法1:二分算法我们可以给A,B,CA,B,CA,B,C都先排好序,然后固定枚举BBB的每一个元素,然后用二分法,找出AAA中小于当前枚举的元素B[i]B[i]B[i]的数的个数,设有xxx个,找出CCC中大于当前枚举的元素B[i]B[i]B[i]的数的个数,设为yyy个,那么由乘法原理,对于枚举的B[i]B[i]B[i]这个来说,就有x∗yx*yx∗y个递增三元组,依次类推,知道枚举完BBB中的元素,累加答案即可。解法2:前缀和我们用数组ca[]ca[]ca[]来原创 2021-03-25 19:55:53 · 326 阅读 · 0 评论 -
外卖优先级
外卖优先级题目描述题意解释核心思路由于订单数量、店铺数量和时间达到10510^5105,我们不能通过时间来枚举每一份订单,这样必然会超时。那么我们该怎么做呢?我们这样想,对于一家店铺来说,在一条时间轴上,必然是有一些时间点有订单,有些时间点没有订单。那么我们可以枚举每一批次订单,这些订单是同一时刻同一店铺的,也就是说某个店铺可能在同一个时间点同时收到好多个同学点的外卖,这样的话时间复杂度就降到O(m)。把一段连续的没有购买订单的这一段统一放到下一次购买的时间来处理,只需要考虑有订单的店。我原创 2021-03-24 20:47:58 · 138 阅读 · 0 评论 -
航班时间
航班时间题目描述核心思路由地理知识可知,左西右东,时差由东向西为减,由西向东为加。如果忘记也没关系,由题目描述也可以知道,中国在西,美国在东,起飞时间t1=10t_1=10t1=10,到达美国的时间t2=12t_2=12t2=12,设时差为d=12d=12d=12,那么如果时差由西向东为加,那么答案就是12-10+12=14,而这正是满足题目所述的。中东是在西,中国是在东,所以从中国飞往中东,就是由东向西,那么时差就是减;从中东飞往中国,就是由西向东,那么时差就是加。由于飞机从中国飞到中东的原创 2021-03-23 22:56:02 · 120 阅读 · 0 评论 -
移动距离
移动距离题目描述核心思路这题其实就是想让我们求出编号为mmm的楼房与编号为nnn的楼房的曼哈顿距离。设编号为mmm的楼房的二维坐标是(x1,y1)(x_1,y_1)(x1,y1),编号为nnn的楼房的二维坐标是(x2,y2)(x_2,y_2)(x2,y2),那么曼哈顿距离为∣x1−x2∣+∣y1−y2∣|x_1-x_2|+|y_1-y_2|∣x1−x2∣+∣y1−y2∣。因为楼房的编号从1,开始,但是为了适应二维数组,为了更方便的求出某个编号楼房的坐标,我们先让楼房的编号都减去1原创 2021-03-23 19:04:35 · 634 阅读 · 1 评论 -
日期问题
日期问题题目描述核心思路按找本题的意思则是abc可能有三种排列方式(年/月/日,月/日/年,日/月/年),在指定区间中寻找并要符合日期条件,则可模拟暴力中找出符合日期条件的数字,并进一步与三种排序顺序的日期进行比对,吻合即输出。值得注意的是,本题的日期范围从1960年1月1日至2059年12月31日,则year%100是从60到59循环查找时不会产生误判。代码#include<iostream>using namespace std;int months[13]={0,31原创 2021-03-22 22:41:18 · 91 阅读 · 0 评论 -
回文日期
回文日期题目描述核心思路由于只有八位数,而且回文串左右对称,因此可以只枚举左半边,即只需要枚举左边四个位置就好了,_ _ _ _ 那么可以从0000填到9999,即范围是000到999999999999,总共有10000个数。然后判断先枚举我们构造出的"回文日期",它是否是真正的合法的回文日期还位置,需要进一步判断判断是否在指定范围内判断日期是否合法通过巧妙地只枚举前面4位数字,可以大大降低时间复杂度。而不是直接真的去判断date1date1date1到date2date2date2中原创 2021-03-22 21:34:27 · 401 阅读 · 0 评论 -
饮料换购
饮料换购题目描述题意解释核心思路初始有nnn瓶饮料。设能够喝到的饮料数量为resresres,我们先喝完nnn瓶饮料,也就是初始时res=nres=nres=n,那么得到nnn个盖子,那么这nnn个盖子可以换n/3n/3n/3瓶饮料,也就喝到了res+=n/3res+=n/3res+=n/3瓶饮料,还余下n%3n\%3n%3个盖子,n/3n/3n/3瓶饮料也就有n/3n/3n/3个盖子,因此总的盖子数目为n/3+n%3n/3+n\%3n/3+n%3。一直迭代循环,直到最终的盖子小于3,则退出原创 2021-03-20 22:57:36 · 141 阅读 · 0 评论 -
买不到的数目
买不到的数目题目描述核心思路这题如果知道这个结论,可以妙接。**结论:**如果p,qp,qp,q都是正整数,并且互质,那么由px+qypx+qypx+qy,x≥0,y≥0x\geq 0,y\geq 0x≥0,y≥0,不能凑出来的最大数是==(p−1)(q−1)−1(p-1)(q-1)-1(p−1)(q−1)−1==。代码#include<iostream>int main(){ int p,q; scanf("%d%d",&p,&q);原创 2021-03-20 22:41:27 · 38 阅读 · 0 评论 -
地宫取宝
地宫取宝题目描述核心思路这一题可以用动态规划来解决:状态表示:f[i][j][k][c]f[i][j][k][c]f[i][j][k][c]表示从起点走到点(i,j)(i,j)(i,j),并且手中已经拿了kkk个物品,并且最后一个物品的价值是ccc的合法方案的集合。因为题目说了只能往右走或往下走,因此,我们可以根据最后一步是往哪个方向走,来划分集合。可以把这个集合分成两部分:最后一步是从上边走向终点(其实也就是往下走),设为小集合S1S_1S1最后一步是从左边走向终点(其实也就是往右走原创 2021-03-20 22:30:34 · 87 阅读 · 0 评论 -
激光炸弹
激光炸弹题目描述题意解释给定一个最多5000×50005000\times 50005000×5000的地图,给出地图上一些目标点(这些点都有价值val),给你一个正方形去框选地图上的目标点,并问所能框选到的目标点之和的最大值是多少。思路分析设s[i][j]s[i][j]s[i][j]表示地图上从坐标(1,1)(1,1)(1,1)到坐标(i,j)(i,j)(i,j)的所有目标点的价值之和。问题:如何求出一块特定的正方形内的所有目标点的价值之和呢?例如上图,假设我们想要求出蓝色正方形内的原创 2021-03-19 23:24:12 · 99 阅读 · 0 评论 -
四平方和
四平方和题目描述核心思路由题意可知,a2+b2+c2+d2=na^2+b^2+c^2+d^2=na2+b2+c2+d2=n,我们可以先用两层循环来求出c2+d2c^2+d^2c2+d2。可以开一个结构体,这个结构体Sum中含有sss,表示c2+d2c^2+d^2c2+d2的和,然后还存储c,dc,dc,d。对这个结构体按从小到大排序,{c2+d2,c,dc^2+d^2,c,dc2+d2,c,d},如果c2+d2c^2+d^2c2+d2不相等,则从小到大排序,如果相等,则比较ccc,如果ccc不相等原创 2021-03-19 23:14:14 · 100 阅读 · 0 评论 -
K倍区间
K倍区间题目描述核心思路1.最简单的方法,采用暴力枚举,三层循环for(int r = 1; r <= n; r++) for(int l = 1; l <= n; l++) { int sum = 0; for(int i = l; i <= r; i++) { ·········计算区间和 } 判断是否可整除k }升级版1:优化最里面一层循原创 2021-03-19 20:13:53 · 238 阅读 · 0 评论 -
分巧克力
分巧克力题目描述核心思路设被分割成的正方形的个数为res,正方形的边长为a,那么有res=Wa∗Ha=WHa2res=\dfrac {W}{a}*\dfrac {H}{a}=\dfrac {WH}{a^2}res=aW∗aH=a2WH。由这个式子可以发现,当边长a增大时,个数res减小;当边长a增大时,个数res增大。也就是说,边长a具有单调性。注意这里说的边长a具有单调性,是说我们分割出来的正方形的边长具有单调性,而不是说题目输入的那个长、宽具有单调性。既然我们切割出来的边长a具有单调性,原创 2021-03-19 19:58:24 · 86 阅读 · 0 评论 -
机器人跳跃问题
机器人跳跃问题题目描述题意解释核心思路根据题意可知:当H(k+1)>EH(k+1)>EH(k+1)>E时,则要损失H(k+1)−EH(k+1)-EH(k+1)−E的能量,那么此时的能量为E−(H(k−1)−E)=2E−H(k+1)E-(H(k-1)-E)=2E-H(k+1)E−(H(k−1)−E)=2E−H(k+1)。当H(k+1)≤EH(k+1)\leq EH(k+1)≤E时,则要得到E−H(k+1)E-H(k+1)E−H(k+1)的能量,那么此时的能量为E+(E−原创 2021-03-18 20:41:17 · 96 阅读 · 0 评论 -
翻硬币
翻硬币题目描述核心思路有nnn个硬币,因为每次都是翻转相邻的两枚硬币,所以最多需要进行n−1n-1n−1次操作。代码#include<iostream>using namespace std;typedef long long LL;LL ans; //最少翻硬币的次数string st,ed; //起始状态,目标状态//翻硬币操作void turn(int i){ //如果当前u这个硬币是*正面朝上,则应该把u这个硬币翻转,使反面o朝上 if原创 2021-03-17 20:58:53 · 168 阅读 · 0 评论 -
递归算法的应用
递归算法的应用递归实现排列型枚举题目描述核心思路可以用递归算法来求解,也可以用STL中的next_permutation函数代码#include<iostream>using namespace std;const int N=10;int path[N]; //存储全排列的方案bool st[N]; //标记某个数字是否已经被使用过了int n;//u表示当前枚举到第几个位置了void dfs(int u){ //u=0,表示第1个位置,u=原创 2021-03-16 21:57:50 · 193 阅读 · 0 评论 -
飞行员兄弟
飞行员兄弟题目描述核心思路每个把手都有两种选择,按/不按,总共有16个把手,因此有216=655362^{16}=65536216=65536种操作。那么我们可以用16位二进制数来表示,即从0000000000000000到1111111111111111。然后用1来表示按下,用0表示不按。主要步骤:枚举从0000000000000000到1111111111111111所有操作按照当前操作,对所有把手进行操作判断方案是否合法,并记录合法方案当2162^{16}216种操作结束后,就原创 2021-03-16 19:07:40 · 71 阅读 · 0 评论 -
费解的开关
费解的开关题目描述核心思路这道题如果纯暴力枚举的话,肯定是会超时的。这题出现了0和1,应该是和位运算有密切关系。所以这道题可以从二进制思想方面进行优化,分析可以发现,这题有三个重要的性质。每一盏灯最多只会被按一次,因为如果按两次的话就相当于没有按,它又回到最初的状态了,多按了一次无用功,必然得不到最少步数的最优解。点击的先后顺序不影响结果。只要第0行所有灯的状态都已经确定了,则全部灯的状态也就确定了,满足题意的方案最多只有一种。因为:如果第0行所有灯的状态确定了,那么此时只能通过按第1行中原创 2021-03-16 17:59:14 · 419 阅读 · 0 评论 -
带分数
带分数题目描述题意解释给定一个数nnn,问有多少组a,b,ca,b,ca,b,c,满足a+bc=na+\dfrac {b}{c}=na+cb=n,并且a,b,ca,b,ca,b,c不重不漏的涵盖了1到9的数字。注意:a,b,ca,b,ca,b,c中都是不含有0的!!!核心思路解法一:暴力枚举出这9个数的全排列,用一个数组num来保存全排列的结果从全排列的结果中用两重循环暴力分解出三段,每段代表一个数,即分隔出的这三段代表a,b,c验证枚举出来的三个数是否满足题干条件,若满足则计数原创 2021-03-15 18:54:19 · 85 阅读 · 0 评论 -
走方格
走方格题目描述核心思路方法一:爆搜DFS,但是会TLE,时间复杂度是指数级别#include<iostream>using namespace std;int n,m;int ans; //记录答案//从点(x,y)爆搜void dfs(int x,int y){ //如果行数不为偶数或者列数不为偶数 if(x&1||y&1) { //当搜到了终点,则说明从起点到终点的这条路径是合法的方案原创 2021-03-11 20:01:39 · 101 阅读 · 0 评论