算法
文章平均质量分 76
本专栏主要收录关于算法的文章,包括常用算法、各种平台算法刷题、分类题单、大厂笔试真题、LeetCode热题等。
卷心菜不卷Iris
你一定会成为你想要成为的人
展开
-
带分数
带分数题目描述题意解释给定一个数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 · 119 阅读 · 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 · 210 阅读 · 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 · 94 阅读 · 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 · 113 阅读 · 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 · 698 阅读 · 1 评论 -
买不到的数目
买不到的数目题目描述核心思路这题如果知道这个结论,可以妙接。**结论:**如果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 · 52 阅读 · 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 · 154 阅读 · 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 · 122 阅读 · 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 · 256 阅读 · 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 · 73 阅读 · 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 · 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 · 114 阅读 · 0 评论 -
日期问题
日期问题题目描述核心思路按找本题的意思则是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 · 105 阅读 · 0 评论 -
递归算法的应用
递归算法的应用递归实现排列型枚举题目描述核心思路可以用递归算法来求解,也可以用STL中的next_permutation函数枚举时,有两种情况:【1】枚举每个位置该放哪个数 这种情况可以保证按照字典序从小到大输出全排列 对于需要按字典序从小大的题目,只能用这种写法了【2】枚举每个数该放到哪个位置 这种情况并不能保证按照字典序从小到大输出全排列 对于需要按照字典序从小大的题目,就不能用这种写法了来分析第一种情况:枚举当前位置原创 2021-04-12 21:12:17 · 311 阅读 · 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 · 191 阅读 · 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 · 153 阅读 · 0 评论 -
回文日期
回文日期题目描述核心思路由于只有八位数,而且回文串左右对称,因此可以只枚举左半边,即只需要枚举左边四个位置就好了,_ _ _ _ 那么可以从0000填到9999,即范围是000到999999999999,总共有10000个数。然后判断先枚举我们构造出的"回文日期",它是否是真正的合法的回文日期还位置,需要进一步判断判断是否在指定范围内判断日期是否合法通过巧妙地只枚举前面4位数字,可以大大降低时间复杂度。而不是直接真的去判断date1date1date1到date2date2date2中原创 2021-03-22 21:34:27 · 446 阅读 · 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 · 134 阅读 · 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 · 140 阅读 · 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 · 358 阅读 · 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 · 163 阅读 · 0 评论 -
外卖优先级
外卖优先级题目描述题意解释核心思路由于订单数量、店铺数量和时间达到10510^5105,我们不能通过时间来枚举每一份订单,这样必然会超时。那么我们该怎么做呢?我们这样想,对于一家店铺来说,在一条时间轴上,必然是有一些时间点有订单,有些时间点没有订单。那么我们可以枚举每一批次订单,这些订单是同一时刻同一店铺的,也就是说某个店铺可能在同一个时间点同时收到好多个同学点的外卖,这样的话时间复杂度就降到O(m)。把一段连续的没有购买订单的这一段统一放到下一次购买的时间来处理,只需要考虑有订单的店。我原创 2021-03-24 20:47:58 · 156 阅读 · 0 评论 -
日志统计
日志统计题目描述核心思路典型的固定大小窗口问题,只需要用双指针移动即可。把所有日志按照时间先后顺序排序,然后利用双指针法,维护一个长度为D但是窗口的大小应该是D-1(因为是左闭右开)的区间,当存在点赞数大于等于 K 的帖子时,就将它记录下来。i指针在前面跑,j指针在后面追。如果j指针所指向的内容以及划出了窗口,则将左指针所指向的id帖子的点赞取消,然后让j指针指向下一个,之后再右移i指针,再将当前右指针所指时刻被点赞的帖子id加上相应的点赞。我们用一个数组cnt来用来记录一个id号获得的赞数。当原创 2021-03-26 18:48:26 · 325 阅读 · 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 · 114 阅读 · 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 · 132 阅读 · 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 · 109 阅读 · 0 评论 -
飞行员兄弟
飞行员兄弟题目描述核心思路每个把手都有两种选择,按/不按,总共有16个把手,因此有216=655362^{16}=65536216=65536种操作。那么我们可以用16位二进制数来表示,即从0000000000000000到1111111111111111。然后用1来表示按下,用0表示不按。主要步骤:枚举从0000000000000000到1111111111111111所有操作按照当前操作,对所有把手进行操作判断方案是否合法,并记录合法方案当2162^{16}216种操作结束后,就原创 2021-03-16 19:07:40 · 81 阅读 · 0 评论 -
全球变暖
全球变暖题目描述核心思路这题通过题意描述,可以知道需要运用Flood Fill 算法来解决。 题目要求有多少个岛屿会被淹没。题目中的岛屿其实就是连通块。我们通过用Flood Fill 算法,可以很容易求出连通块的个数,也就是求出岛屿的个数,但是题目并不是要求有多少个岛屿。我们可以在用Flood Fill 算求连通块的过程中,求出当前这个连通内的土地的总数,设为total,同时求出这个连通块内有多少个土地是与海洋相连的,即淹没量,设为bound。这里观察出一个性质:当一个连通块内的土地总量total原创 2021-03-27 19:05:44 · 89 阅读 · 0 评论 -
费解的开关
费解的开关题目描述核心思路这道题如果纯暴力枚举的话,肯定是会超时的。这题出现了0和1,应该是和位运算有密切关系。所以这道题可以从二进制思想方面进行优化,分析可以发现,这题有三个重要的性质。每一盏灯最多只会被按一次,因为如果按两次的话就相当于没有按,它又回到最初的状态了,多按了一次无用功,必然得不到最少步数的最优解。点击的先后顺序不影响结果。只要第0行所有灯的状态都已经确定了,则全部灯的状态也就确定了,满足题意的方案最多只有一种。因为:如果第0行所有灯的状态确定了,那么此时只能通过按第1行中原创 2021-03-16 17:59:14 · 505 阅读 · 0 评论 -
玄武密码-
玄武密码题目描述洛谷P5231题意:给你一个母串TTT,然后mmm个匹配串SiS_iSi,求 TTT 对于SiS_iSi能匹配的最长前缀长度核心思路这题可以使用SAM来解决,这是因为SAM有个最简单、也最重要的性质:它包含关于字符串sss的所有子串的信息。任意从初始状态t0t_0t0开始的路径,如果我们将转移路径上的标号写下来,都会形成sss 的一个子串 。反之每个sss的子串对应从t0t_0t0开始的某条路径。有了这个性质之后,那么对于这道题,我们就可以得到这个:从t0t_0t0原创 2021-08-16 01:14:41 · 225 阅读 · 0 评论 -
Splay
Splay题目描述核心思路这里主要理解一下该怎么删除一段区间[L,R][L,R][L,R]中的数呢?设区间[L,R][L,R][L,R]为子树ttt我们先找到LLL的前驱L−1L-1L−1,找到RRR的后继R+1R+1R+1,然后将L−1L-1L−1旋转到根,将R+1R+1R+1旋转成为L−1L-1L−1的儿子,根据中序遍历可知,此时应该为L−1,t,R+1L-1,t,R+1L−1,t,R+1,而ttt就是R+1R+1R+1的左子树,因此我们想要删除区间[L,R][L,R][L,R]中的数,就原创 2021-08-26 23:09:47 · 86 阅读 · 0 评论 -
2-SAT问题
2-SAT 问题题目描述核心思路这是一道2-SAT模板题。那么什么是2-SAT呢?就是有一些集合,每个集合中有且仅有两个元素,且不能同时选取两个元素,集合间的元素存在一定的选择关系,求解可行性及可行方案。我们来看这两个命题x,yx,yx,y,x⋁yx\bigvee yx⋁y = ¬(¬x⋀¬y)\neg(\neg x\bigwedge \neg y)¬(¬x⋀¬y),要想x⋁yx\bigvee yx⋁y这个式子为真,那么也就是说后面的这个式子¬(¬x⋀¬y)\neg(\neg x\bigwed原创 2021-09-22 22:05:43 · 119 阅读 · 0 评论 -
最小表示法
最小表示法原创 2022-06-19 21:49:15 · 135 阅读 · 0 评论 -
回文串--
回文串题目描述洛谷P3649回文树回文树 (EER Tree,Palindromic Tree,也被称为回文自动机)是一种可以存储一个串中所有回文子串的高效数据结构,使用回文树可以简单高效地解决一系列涉及回文串的问题。回文树大概长这样:回文树是由转移边和后缀链接 (fail 指针)组成,每个节点都可以代表一个回文子串。因为回文串长度分为奇数和偶数,因此我们需要建立两棵树,一棵树中的节点对应的回文子串长度均为奇数,另一棵树中的节点对应的回文子串长度均为偶数。也就是说,这棵回文树其实包含了两原创 2021-08-22 22:40:07 · 649 阅读 · 1 评论 -
可持久化并查集
可持久化并查集题目描述洛谷P3402 可持久化并查集核心思路可持久化并查集是建立在可持久化数组上的,在学习可持久化并查集之前,需要先学习主席树(可持久化权值线段树),权值线段树,可持久化线段树,移步可持久化线段树1和可持久化线段树2可持久化并查集=可持久化+并查集=可持久化数组+并查集=主席树+并查集并查集有两种优化方式:路径压缩按秩合并由于需要我们支持的只有集合的合并、查询操作,当我们需要将两个集合合二为一时,无论将哪一个集合连接到另一个集合的下面,都能得到正确的结果。但不同的连原创 2021-10-01 21:11:58 · 2254 阅读 · 1 评论 -
无源汇上下界可行流
无源汇上下界可行流题目描述核心思路这个题目,给出了容量的下界和上界,这使得与普通的网络流不同。设容量下界为Cl(u,v)C_l(u,v)Cl(u,v),容量上界为Cu(u,v)C_u(u,v)Cu(u,v),边(u,v)(u,v)(u,v)上的流量为f(u,v)f(u,v)f(u,v),要求Cl(u,v)≤f(u,v)≤Cu(u,v)C_l(u,v)\leq f(u,v)\leq C_u(u,v)Cl(u,v)≤f(u,v)≤Cu(u,v)我们令该式子都减去Cl(u,v)C_l(u,v原创 2021-08-06 21:54:08 · 558 阅读 · 0 评论 -
AC自动机
AC自动机AC自动机的作用:给定一段包含mmm个字符的文章,再给定nnn个单词,找出有多少个单词在文章里面出现过。AC自动机实际上是先将KMP算法和Trie字典树结合,用多个模式串构建一棵字典树,然后在这棵字典树上构建失配指针,失配指针相当于KMP算法中的next[]数组(匹配失败时的回退位置),最后将主串在Trie树上进行模式匹配。AC自动机算法分为3步:构建一棵字典树构建AC自动机进行模式匹配这里主要讲解如何构建AC自动机和如何进行模式匹配。构建AC自动机在构建AC自动机时,其原创 2021-08-09 15:28:51 · 988 阅读 · 3 评论 -
Manacher算法
马拉车算法原创 2022-06-19 22:15:20 · 128 阅读 · 0 评论 -
字符串哈希
字符串哈希原创 2022-06-19 21:51:37 · 115 阅读 · 0 评论 -
可持久化线段树1
可持久化线段树 1题目描述洛谷P3919 可持久化线段树 1(可持久化数组)核心思路可持久化数组是一种可以支持回退,访问之前版本的数组, 是一些其他可持久化数据结构的基石(例如可持久化并查集)。这个题目我们可以使用到主席树,可以先看这道题可持久化线段树2,它是使用主席树来维护权值线段树。但是对于这道题,我们就不用主席树维护权值线段树了,只要维护一个普通线段树就好了。算法设计:用原数组建立一个普通线段树每次要对数组的某一版本的某一位置进行修改,就相当于以主席树的相应版本的相应位置为模板原创 2021-10-01 17:33:54 · 300 阅读 · 0 评论