
算法进阶
文章平均质量分 82
栖林_
一个励志于做全栈工程师的平平无奇大学生,希望在这里留下自己学习的记录
展开
-
每日算法打卡:动态求连续区间和 day 31
接下来 m 行,每行包含三个整数 k,a,b (k = 0,表示求子数列[a,b]的和;k=1,表示第 a 个数加 b)。给定 n 个数组成的一个数列,规定有两种操作,一是修改某个元素,二是求子数列 [a,b] 的连续和。输出若干行数字,表示 k = 0 时,对应的子数列 [a,b] 的连续和。第一行包含两个整数 n 和 m,分别表示数的个数和操作次数。数据保证在任何时候,数列中所有元素之和均在 int 范围内。第二行包含 n 个整数,表示完整数列。题目来源:《信息学奥赛一本通》数列从 1 开始计数。原创 2024-01-31 17:07:53 · 535 阅读 · 0 评论 -
算法基础之树状数组
总结一下树状数组能做的操作就是单点修改和区间查询,对于他的其他的功能,例如区间修改,单点查询,区间修改,区间查询都是使用差分的思想转化成最基础的思想。由于我们更改了原数组中的一个数值,那么他对应的所有父节点的数值都需要更改,那么x的父节点其实就是x+lowbit(x),给出代码如下。,我们如何确定x的层数呢,其实是可以利用x的二进制表示,其中末尾有几个0,就是第几层的数字,假设他最后有k个0,那么。他和前缀和数组的区别就是,树状数组支持修改原数组的内容,而前缀和数组不支持,需要重新求前缀和数组。原创 2024-01-25 18:04:43 · 906 阅读 · 0 评论 -
算法基础之线段树
第二个操作称之为区间查询,查询时,如果有查询区间可以包含某一个区间,那么就直接返回,如果是不包含,那么就是进行递归,直到包含,然后进行计算再回溯。假设序列为1到7,那么根节点存的就是这7个数的总和,如果区间长度不是1的话,就会平均分成两部分,这两部分就是根节点的子节点,如此递归下去。他有两个操作,第一个操作是单点修改,是一个递归的过程,只用修改信息需要变化的节点,我们需要改变叶子节点,然后回溯时重新计算即可。第一个是pushup,用子节点信息更新当前节点信息,这个一般不用写,就一句话。原创 2024-01-25 18:03:45 · 441 阅读 · 0 评论 -
每日算法打卡:逆序对的数量 day 24
逆序对首先数对,他是一个线性代数中的概念,简单的理解就是,前面的数字比后面的数字大就是一个逆序对,需要注意的是,如果两个数字相同,则应该标记为不同的数字,只是数值相同。假设我们使用双指针,找到了一个a[j]原创 2024-01-24 18:30:58 · 809 阅读 · 0 评论 -
每日算法打卡:航班时间 day 23
小 h 的女朋友发现小 h 上午十点出发,上午十二点到达美国,于是感叹到“现在飞机飞得真快,两小时就能到美国了”。这道题的意思就是,给一次往返的起落时间,因此不知道时差是多少,最终需要计算的就是真实的飞行时间是多少。保证输入时间合法(0≤h≤23,0≤m,s≤59),飞行时间不超过24小时。每组数据包含两行,第一行为去程的起降时间,第二行为回程的起降时间。这个题目的难点就是对于输入的处理,那我们需要做的就是对形式的统一。假设飞机来回飞行时间相同,求飞机的飞行时间。仔细观察后发现飞机的起降时间都是当地时间。原创 2024-01-23 21:02:01 · 430 阅读 · 0 评论 -
每日算法打卡:日期问题 day 23
如果是最暴力的做法,就可以从1960.1.1枚举到2059.12.31,然后有两个判断条件,一是判断日期是否合法,二是是否满足题目要求。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。输出若干个不相同的日期,每个日期一行,格式是”yyyy-MM-dd”。原创 2024-01-23 21:00:20 · 430 阅读 · 0 评论 -
每日算法打卡:移动距离 day 23
那么其实问题就变成了如何求这两个编号的坐标了,在这里有一个操作,将所有的编号都减一,这样的话第一行刚好和列号相同。我们的问题是:已知了两个楼号 m 和 n,需要求出它们之间的最短移动距离(不能斜线方向移动)。这道题目要求的距离实际上在数学中叫做曼哈顿距离,给定两个点的坐标可以用公式表示为。输入共一行,包含三个整数 w,m,n,w 为排号宽度,m,n 为待计算的楼号。如果是正常的数组,列号可以使用行号模宽度即可,在这道题里就只需反转一下即可。X星球居民小区的楼房全是一样的,并且按矩阵样式排列。原创 2024-01-23 20:59:39 · 1019 阅读 · 0 评论 -
每日算法打卡:归并排序 day 22
归并排序是一种非常重要的分治思想,而且代码不是很复杂,是很有可能在做题时被要求手搓归并的。我们用双指针,分别指向两个排好序的数组,然后总是选择较小的数存入到新数组中。请你使用归并排序对这个数列按照从小到大进行排序。输出共一行,包含 n 个整数,表示排好序的数列。归并排序的整体思想是先递归拆分,再排序,最后合并。拆分是按照位置拆分的,一般都是按照中间位置拆分。给定你一个长度为 n 的整数数列。输入共两行,第一行包含整数 n。并将排好序的数列按顺序输出。范围内),表示整个数列。这里的难点在于如何合并。原创 2024-01-22 16:00:58 · 443 阅读 · 0 评论 -
每日算法打卡:回文日期 day 22
有没有更好的枚举方法呢,其实是有的,我们可以调整一下顺序,暴力的做法是先枚举每一天,再判断是否是回文,调整顺序之后就变成了,先枚举回文串,再判断是否在日期范围内的,最后判断一下日期是否合法即可。一个 8 位数字是回文的,当且仅当对于所有的 i(1≤i≤8) 从左向右数的第 i 个数字和第 9−i 个数字(即从右向左数的第 i 个数字)是相同的。牛牛认为,一个日期是回文的,当且仅当表示这个日期的 8 位数字是回文的。都是真实存在的日期,且年份部分一定为 4 位数字,且首位数字不为 0。原创 2024-01-22 15:59:50 · 359 阅读 · 0 评论 -
每日算法打卡:错误票据 day 18
第二个做法就是用排序的做法,首先把整个数组排序,我们要从第二个位置开始扫描,如果这个数字跟前一个数字的差为0,那么就是重号,如果数字跟前一个数字相差大于1,则为断号。对于这个题目的解决是这样的,我们可以开一个布尔数组,从前往后扫描每一个数字,先判断每一个数字是否出现过,如果出现过就说明这个id是重复的。因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。对于中断的数字,我们可以先找到最小值,再从最小值开始扫描,第一个缺失的位置就是断号的位置。每张票据有唯一的ID号。原创 2024-01-18 16:35:32 · 547 阅读 · 0 评论 -
每日算法打卡:连号区间数 day 18
然后来想一下如何优化,我们首先考虑这个判断的过程是否可以优化,那么一个区间是连号区间有什么样的性质,其实对于一个连号区间,必然是满足最大值减最小值等于子区间左右两个下标相减的,所以这个连号区间的条件就可以等价于最大值与最小值的差是否满足子区间左右下标相减。题目的意思就是求1到n的连续子区间的个数,要注意的就是这个排列的顺序是不可改变的,而且每个数字只出现一次。最暴力的做法就是枚举所有的子区间,然后再判断区间是否是连续的,这样的做法大概就是。的“连续”数列,则称这个区间连号区间。第二行是 N 个不同的数字。原创 2024-01-18 16:34:34 · 1362 阅读 · 0 评论 -
每日算法打卡:递增三元组 day 17
这里考虑到这个不等式的关系,就是A小于B小于C,如果我们枚举的是A或者C,那么对于我们统计的B和C的数量,是无法简单的使用乘法原理直接相乘的,因为乘法原理是要求独立的,因此我们在这里是需要枚举B的,对于每一个B只需要在计算满足要求的A的个数,满足要求的C的个数,再相乘即可。对于枚举类型的题目,最重要的就是枚举的顺序,要注意不重不漏,其次就是要对代码进行优化,利用题目性质,等式,进行优化。这道题的意思很清楚,就是从A、B、C三个数组中选出三个数满足严格小于关系,问满足条件的三元组的个数。原创 2024-01-17 11:26:51 · 863 阅读 · 0 评论 -
每日算法打卡:特别数的和 day 17
小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。题目来源:第十届蓝桥杯省赛C++ B组,第十届蓝桥杯省赛Java B组。这里我们可以枚举从1到n,然后再把每一位扣出来是否是2、0、1、9即可。这道题比较简单,就是问从1到n中包含2、0、1、9的数的和。请问,在 1 到 n 中,所有这样的数的和是多少?共一行,包含一个整数,表示满足条件的数的和。共一行,包含一个整数 n。原创 2024-01-17 11:25:58 · 395 阅读 · 0 评论 -
每日算法打卡:波动数列 day 16
我们可以发现在这个过程中的变量是非常多的首先x是属于任意整数的,其次是每一个d,都有两种选法,所以我们可以从后往前进行推算,因为只要后面的数字确定了,前面的情况其实也并不算多。那么对于状态计算,我们仍然考虑集合划分,可以划分成两个子集,第一种就是最后一项+a的,第二种是最后一项-b的,我们只需要分别求两边的情况方案数相加即可。这里有一个名为同余定理的简化方法,因为需要s减去和与n的模值为0,所以只需要s与和的模n的余数相同即可,因为相减是可以把余数减掉的。那么问题就变成了,所有满足要求的d的取值的方案数。原创 2024-01-16 12:03:21 · 593 阅读 · 0 评论 -
每日算法打卡:地宫取宝 day 16
对于这个集合如何进行状态计算,就是如何进行状态划分,因为这个题目的状态非常多,就需要逐步分析,就像剥洋葱一样,一层一层细分,第一层是按照位置分,分别从上向下走和从左向右走两种,第二层是按照第i,j个物品是否取得划分,那么对于取的情况下,对于每一个上一个物品的数值是多少再次进行划分。这里的i,j表示当前的坐标,k表示当前取到了多少个,c表示取到物品的数值,确保其是递增的。他的意思就是,从七点走到i,j取了k件物品,最后一个物品的价值是c的所有合法方案的集合。当小明走到出口时,如果他手中的宝贝恰好是。原创 2024-01-16 12:02:42 · 1135 阅读 · 0 评论 -
每日算法打卡:最长上升子序列 day 14
从状态计算的角度来看,我们以倒数第二个位置可以取的不同的数字进行集合划分,一共有i种情况,分别是空,a[1],a[2]一直到a[i-1],那么对于其中任意一种情况,都可以继续进行划分,当不符合条件的时候,只需要进行排除即可。这是一个经典的DP问题,我们依旧从集合的角度来看,集合的含义就是所有以a[i]结尾的严格单调上升的子序列。这道题目的意思很简单,就是从序列中找到一个最长的严格递增的子序列,例如样例中的结果就是,1,2,5,6。给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。原创 2024-01-14 17:19:00 · 378 阅读 · 0 评论 -
每日算法打卡:摘花生 day 14
这里其实隐藏了一个初始化问题,就是边界情况,但是由于是要取最大值,恰好省略了,在其他DP问题是一定要分析初始化和边界问题的,其次是在递推的过程种,按照什么样的顺序计算呢,因为每一次算i,j时都需要知道之前的两个数值,这是可以画出一个有向图的,这里的顺序就是要按照拓扑序来计算,这道题按照数组遍历就恰好满足。从状态计算的角度来看,也就是集合划分,因为到达i,j的路线只有两种路线,一种是从i-1,j到i,j的位置,也就是从上到下,第二种就是从左到右走的。题目来源:《信息学奥赛一本通》原创 2024-01-14 17:18:27 · 1019 阅读 · 0 评论 -
每日算法打卡:01背包问题 day 13
对背包问题来说,他的数组的含义就是所有选法的集合,有两个条件作为限制,第一是只从前i个物品中选,第二个条件是选出来的物品的总体积需要小于等于j,那么对于每一个数组中的元素来说,他代表的含义就是选出的物品的最大价值。这里状态表示的含义其实可以细分,首先就是集合是什么,也就是这整个数组是什么含义,其次是集合的属性是什么,也就是对应到数组中具体的值的含义,含义是有三种的,最大值,最小值,数量。如果包含,那么他就等价于从前i-1个物品中选择物品的总体积不大于j的最大价值,再加上第i个物品的价值即可。原创 2024-01-13 19:59:18 · 1220 阅读 · 0 评论 -
每日算法打卡:蚂蚁感冒 day 13
这里其实是有一个等效的思想,假设两只蚂蚁相遇,那么他们会互相掉头,其实就等效他们互相穿过,只是状态不一样,那么对于状态我们也可以分类,两个都没有感冒,则穿过后都不感冒,只要有一个感冒,那么穿过后都感冒。在左边向右的蚂蚁就需要分情况讨论了,如果右边有向左走的蚂蚁,那么左边有向右走的蚂蚁都会被感染,如果右边没有,那么左边也都不会被感染,最终就只有最初的蚂蚁。这道题其实就是一个脑筋急转弯,当两只蚂蚁相遇时就会掉头,有一只蚂蚁感冒,在相遇是会传染,从而不断传播,问当所有蚂蚁走出杆子时,有多少只蚂蚁感冒了。原创 2024-01-13 19:58:22 · 1010 阅读 · 0 评论 -
每日算法打卡:机器人跳跃 day 11
我们判断时调用判断的函数,如果mid的值满足要求,说明大于等于mid的值一定是满足要求的,答案应该是在mid值或者mid的左侧,说明此时我们应当将右边界缩小,变为R = mid,否则就是L = mid + 1。这里我们可以注意到,假设存在一个最小的满足要求的值,那么只要一个大于他的值,就必然是满足要求的,而对于小于他的值,就必然是不满足要求的。假设机器人在第 k 个建筑,且它现在的能量值是 EEE,下一步它将跳到第。输出一个整数,表示所需的最少单位的初始能量值上取整后的结果。的能量值,否则它将得到。原创 2024-01-12 16:50:12 · 2619 阅读 · 0 评论 -
每日算法打卡:买不到的数目 day 12
假设我们不知道这个数学定理,如何尽力去分析呢,首先假设这两个数字是p和q,他们的最大公因数是d,那么对于大于p和q,且因数中没有d的数字是一定凑不出来的,反过来,那么只要他们的最大公因数d是大于1的,就一定是无解的,那么这种情况就可以排除。那么如果p和q互质,也就是他们的最大公因数为1,是否一定有解呢,答案是肯定的,因为这里有一个定理叫做裴蜀定理,他的内容是如果p和q的最大公因数为d,那么一定存在两个整数满足。例如6和2,他们的最大公因数是2,那么对于大于6的奇数,因数没有2,因此也无法用6和2凑出来。原创 2024-01-12 16:49:02 · 398 阅读 · 0 评论 -
每日算法打卡:饮料换购 day 12
假设我们一开始有n瓶,那么结果就先有n,然后又有了n个瓶盖,那么当n大于等于3的时候就可以一直换,换的瓶数除3下取整,盖子数量就是n除3下取整再加上n除3的余数。乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去(但不允许暂借或赊账)。请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的 n 瓶饮料,最后他一共能喝到多少瓶饮料。这道题其实就是一种小学数学题目,三个瓶盖换一个饮料,问最多可以喝多少瓶饮料。输出一个整数,表示一共能够喝到的饮料数量。原创 2024-01-12 16:48:12 · 449 阅读 · 0 评论 -
每日算法打卡:K倍区间 day 10
在遍历前缀和数组的过程中,每一次遇到目标的余数,就在答案上加上之前的个数,因为新的数字和之前的每一个数字都算一组新的满足条件的情况,因此只需要。这里的含义就是走到1,只有一个数,不算区间,不算一次,走到3,1和3算一次,记录,走到15,1和15算一次,3和15算一次,因此加2。对于这个题而言,就是枚举左端点和右端点,这样就可以枚举所有的方案了,然后再判断左右端点之间的和是否是k的倍数,这里的时间复杂度是。这里的含义就是,6本身是一种,加1,10本身是一种,6到10是一种,加2,一共就是3种。原创 2024-01-10 20:03:32 · 1423 阅读 · 0 评论 -
每日算法打卡:四平方和 day 9
那么我们如何快速的判断一个数是否在数组中出现过,一种做法就是使用哈希,另一种就是使用二分的做法。,我们只需要判断这个t是否在之前存的数组中出现过即可,如果出现过,则找到了一组解。是从大到小的顺序,也就是查询是否存在时是从大到小查的,假设存在对应的t,那么对于。这道题的内容比较简洁,就是将一个整数分成四个整数的平方和的形式,有很多做法。一定是成立的,其次我们在枚举的时候,对于a和b是小到大枚举的,这时算出来的。存起来,之后再枚举a和b,对于每一个我们枚举的a和b,都可以计算出。原创 2024-01-09 12:41:12 · 506 阅读 · 0 评论 -
每日算法打卡:分巧克力 day 9
我们可以发现一个规律,边长越大,切出来的正方形个数就越少,那我们其实是可以用公式表示出来每一个矩形能切多少块正方形的。大于等于k是成立的,说明说明,比中间值小的所有数字,都是满足条件的,因此我们就要让左边界更新为中心值。当然小朋友们都希望得到的巧克力尽可能大,你能帮小明计算出最大的边长是多少么?这道题就是将n个矩形,切出尽可能大的等长的k个正方形,求最大的可能正方形边长。我们需要找到一个个数大于等于k的对应的x的最大值。那么判断的条件就是满足块数大于等于k的x的最大值。小明拿出了珍藏的巧克力招待小朋友们。原创 2024-01-09 12:40:24 · 464 阅读 · 0 评论 -
每日算法打卡:激光炸弹 day 8
那么我们枚举的时候,因为边长R是固定的,所以只需要枚举正方形的右下角的坐标即可,例如枚举到(i,j)时,左上角的坐标应该是(i-R+1,j-R+1)题目就是说在一个网格区域内放一定数量的炸弹,每个炸弹可以摧毁一个正方形区域的范围,问最多可以摧毁多少价值的目标。那其实把这个问题抽象出来就是,在一个大矩阵中,取出边长为R的正方形,求这个正方形内总价值的最大数目。激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆炸范围,即那个正方形的边必须和。,分别代表目标的 x 坐标,y 坐标和价值,数据用空格隔开。原创 2024-01-08 13:00:56 · 1259 阅读 · 2 评论 -
每日算法打卡:子矩阵的和 day 8
我们是想要计算(2,3)的数字,实际上就需要用(1,3)的数字加上(2,2)的数字,也就是黄色(包括绿色)加上蓝色(包括绿色),但是这样我们就把绿色加了两遍,因此需要减去一个绿色的(1,2),这样我们就算除了原本(2,3)对应的数字剩下数字的和,最后只需要加上(2,3)原本的数字即可。第二个问题就是,假设我们已经有了前缀和数组,我们如何快速算出子矩阵的和是多少,这里的数学原理是与之前一样的。对于一维的前缀和,就是求某一段的前缀和,这道题是二维数组中的前缀和,是求任意区域的数字之和。这就是二维前缀和的思想。原创 2024-01-08 12:59:58 · 1352 阅读 · 0 评论 -
每日算法打卡:数的范围 day 7
这里在寻找到左端点时,我们可以判断左端点的值是否为目标值x,如果不是,则说明大于等于x的第一个值不是x,因此整个序列中也就不存在x了。这道题就是给了一个长度为n的排好序的数组,还有q次询问,对于每次询问,我们需要返回这个元素的起始位置和终止位置。之后我们需要判断条件,目标值的右端点就可以按照arr[mid]原创 2024-01-07 11:50:02 · 840 阅读 · 0 评论 -
每日算法打卡:数的三次方根 day 7
对于这个判断条件,其实可以选择小于等于目标值也可以取大于等于目标值,我们只需要每次取中点,自乘三次,与输入值比较即可,如果大于等于,说明M取大了,要将右端点缩小,如果小于等于,说明M取小了,将左端点向右移动即可。补充,这里对于浮点数的等于比较,受限于精度,我们只要求他的差值小于某一个极小的数,则认为他们两个数相等。这道题就很简单了,就是给我们一个数求他的三次方根,首先三次方根的函数图像如下。我们确定一个区间范围,最大的范围就是在负一万到正一万之间,之后逐渐缩小。共一行,包含一个浮点数,表示问题的解。原创 2024-01-07 11:49:13 · 682 阅读 · 0 评论 -
算法基础之二分与前缀和 day 6
对于计算区间和还有其他的方法,例如树状数组和线段树,这个我们以后会讲解,而对于前缀和来说,他的局限性就在于序列只能是静态的序列,一旦其中的某个数值被修改,就需要重新计算前缀和,而树状数组和线段树是可以实现边查边算的。分成两段之后,我们只需要判断M的颜色(性质),如果是在红色区间,就说明目标值一定在绿色区间[M,R]内,否则说明目标值在红色区间[L,M-1]内。将[L,R]分成[L,M]和[M+1,R],如果M是绿色,说明目标值在红色区间[L,M],否则就是在绿色区间[M+1,R]原创 2024-01-06 16:12:30 · 1125 阅读 · 0 评论 -
每日算法打卡:飞行员兄弟 day 5
这里我们把每一个数都可以理解为一个十六位的二进制数,某一位为1的话就是就按下,某一位是0的话就不按,对于每一个方案分别对开关进行操作,最后对结果进行判断,是否满足题目要求,符合条件只需要判断一下步数是否最小即可。但是这道题与之前的题目又有不同,因为对于一个开关来说,有一行和一列的开关都会影响到他的状态,因此我们就不能用递推的方法解决这个方法了。对于所有开关问题的共同点有两个,首先每个开关最多按一次,因为第二次按下等同于没有按,其次结果和按下的顺序是无关的。只有当所有把手都打开时,冰箱才会打开。原创 2024-01-05 12:35:20 · 810 阅读 · 0 评论 -
每日算法打卡:带分数 day 4
第一种最暴力的方法就是枚举所有方案,其实就是枚举1到9的全排列,对于每一次排列,枚举每一次a、b、c的位数,即分别对应的数字是什么,其实我们可以只枚举a和b,因为n是确定的,可以直接计算出c1的值,我们只需要判断c是否符合条件即可。,对于每一个情况,需要分出不同的a、b、c,对于九个数字,这之中有八个空隙,我们选择其中两个空隙放如隔板即可,也就是8选2,这个数字大概在九千万的量级,刚好是卡在时间限制之中的。的形式,需要注意的是b除c并不是整除,在a、b、c中需要出现数字1到9。注意特征:带分数中,数字。原创 2024-01-04 12:30:38 · 2462 阅读 · 0 评论 -
每日算法打卡:翻硬币 day 4
这一类问题其实是有一个固定形式的,是给定初态和末态,然后规定一些操作,问最少需要多少次操作可以从初态到达末态,这种问题一般有两种基本做法,一种就是宽搜(bfs),另一种就是递推做法。现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?因此我们只需要从头到尾,依次保证前面的硬币符合条件即可,每一次使该位置和位置之后的硬币反转即可,而且题目保证了必有解。桌上放着排成一排的若干硬币。两行等长的字符串,分别表示初始状态和要达到的目标状态。原创 2024-01-04 12:29:48 · 430 阅读 · 0 评论 -
每日算法打卡:递归实现组合型枚举 day 4
首先考虑在手算情况下是如何确保不重不漏的枚举出所有情况的,例如从1到5这5个数字中选取3个数字,一种比较容易想到的方法就是,优先取最小的数字填入左边的两个空位,第三个空位依次枚举,枚举完成之后,换掉第二个位置的数字,依次枚举。我们在之前分析的时候发现,有些情况是可以直接忽略而不用进行递归的,我们选择的数字是从start到n的,如果当start到n的所有数字都选上也不够要求的剩下空位个数字,就是不符合情况,可以特判直接退出的。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如。原创 2024-01-04 12:28:55 · 1056 阅读 · 0 评论 -
每日算法打卡:费解的开关 day 3
这里就引出了第二个问题,如何简易的实现0和1中5位的指数型枚举,从0到31,刚好对应二进制的5个位,因此从0遍历到31刚好可以分别对应5个位置的所有情况,并且我们将二进制的1代表这个位置将要按下开关,将0代表不按下开关,这样就能实现二进制的指数型枚举。这里就引出来一个问题,我们如何确定这样的方式是结果最小的呢,换句话说,那么我们如何确定第一行的状态呢,因此就需要遍历第一行的状态,这里就需要用到之前我们讲的指数型枚举了,对应的就是2的5次方,是32种情况,这样就可以达到不重不漏的效果了。原创 2024-01-03 12:32:01 · 962 阅读 · 0 评论 -
每日算法打卡:简单斐波那契 day 3
递推则与之相反,是利用子问题直接计算出原问题的答案,例如同样的的求第n项的数字,我们只需要利用第1项和第2项求和计算出地3项,再利用第2项和第3项计算出第4项,直至计算出第n项。用比较抽象的说法是,递归是把一类大问题分解成若干个类似的子问题,例如要求第n项的数字,只需要求第n-1和第n-2项即可,一直分解到第1项和第2项即可。斐波那契数列一定要先看前两项是如何定义的,这里的前两项是0和1,对于当n大于等于3时,每一项等于前两项的和。例如,我们使用a表示第1项,使用b表示第2项,使用c表示第3项。原创 2024-01-03 12:30:55 · 386 阅读 · 0 评论 -
每日算法打卡:递归实现排列型枚举 day 2
全排列,第二个要求就是要按照字典序从小到大输出,字典序就是对于两个序列或者字符串,从头开始比较,只要相同就向后移动,不同的话就是谁小谁的字典序就小,如果都相同就是字典序相同,规定短的序列字典序较小。我们也需要记录每个位置的状态,可以采用数组或者数位来记录,这里我们同样采用数组的方式,除此之外,我们需要记录哪些数字被用过,因此我们需要一个布尔数组来记录。我们就可以通过这样一个过程,依次枚举每个位置,将不同的数字放入其中,直到我们枚举到最后一个位置,将答案输出即可。这道题的意思很简单,就是生成从。原创 2024-01-02 12:07:28 · 817 阅读 · 0 评论 -
每日算法打卡:递归实现指数型枚举 day 1
对于递归的情况,我们在回到上一步的时候,需要恢复原来的样子,不然再次进行操作时,可能会引出错误的情况,需要保持这个习惯,其次我们在写递归函数的时候,需要首先考虑何时递归结束。这里我们也称之为递归搜索树,我们以三个数字为例,实际上是可以通过这种方法枚举出所有情况的,接下来的问题就是我们如何去实现,如何记录每一种情况下的状态。这道题的目的其实是训练我们递归的思想,对于递归(dfs)最重要的就是顺序,需要不重不漏的把所有可能的方案都顾及到,具体到这道题我们就只需要从。这里的状态我们有两种方法,一是开一个长度为。原创 2024-01-01 22:17:17 · 873 阅读 · 0 评论 -
算法进阶——例题
求a的b次方对p取模的值其中1≤abp≤109。原创 2023-05-30 17:57:08 · 67 阅读 · 1 评论 -
算法进阶——64位整数乘法
求a乘b对p取模的值,其中1 \le a,b,p \le 10^{18} $原创 2023-05-30 17:38:41 · 345 阅读 · 1 评论