- 博客(23)
- 收藏
- 关注
原创 洛谷P3375题解 KMP入门
思路:最朴素的想法就是,遍历长字符串,每个点都与短字符串进行匹配,检查是否能够完全匹配,时间复杂度O(N^2),一看题目数据1e6,那必然超时了。
2023-12-12 23:18:30 928
原创 离散化学习笔记&例题题解(并查集+离散化)
例如数组a[]={1,1000000000,200000},对应的离散后的数组就是b[]={1,3,2},将实际大小,转化为在新数组的下标相对大小。离散化的本质,是映射,将间隔很大的点,映射到相邻的数组元素中,且不改变原数组元素的大小。减少了对空间的需求,也减少计算量。第三步有两个方法:第一个用二分查找原数组中元素在新数组的对应下标,时间复杂度O(logn),还有一种就是STL大法了,利用。函数,可以将所有重复元素放入数组末尾,返回去重后的尾地址。的映射,可以将时间复杂度降为O(1)。
2023-12-07 16:08:37 861 1
原创 洛谷P1314 题解(前缀和+二分答案)
思路:题号很棒,所以选择写这题的题解(bushi)。首先可以判断这题可以使用二分答案,若y>s,则增大w,反之减小,具有单调性。接着便是需要用到前缀和,因为每次二分都要查询区间内的和(虽然题目上是积,但实际上就是两个前缀和数组的积,所以还是查询和),于是便可以写两个前缀和数组,一个储存数量,一个储存价值,到这,基本已经做完了。
2023-12-04 20:00:21 619 1
原创 洛谷 P2678 详细题解
这道题如果使用暴力搜索直接求解会超时。实际上,我们可以发现,这个所谓的最短跳跃的答案是有一个确定的范围限制的,我们就可以考虑一种另外的方法去解决——枚举答案,并去验证答案是否可行。于是就可以请出二分答案这一做法。通过判断某个长度是否满足移石子数量小于给定数量即可。:起点是0和n+1,看到这可以试着自己去做做。
2023-12-02 19:56:00 684 1
原创 Codeforces Round 359 (Div. 2) B 详细题解
思路:CF的前三题是典型的思维量大,但不怎么涉及算法的题。所以我们着重从这个式子入手。通过观察我们可以发现,当前一项大于后一项时,式子恒为0,于是我们可以想到,加入交换一下第一项和第二项呢?可以发现整个式子扩大了1,于是这题就完成了。以下是ac代码(附详细注释)
2023-11-30 21:47:13 490
原创 Codeforces Round 905 (Div. 3) D 详细题解
题目需要找出是否存在一对线段不相交,数据量较大,遍历肯定超时,于是我们可以想到,只要比较所有线段中,是否存在一个最小的r比最大的l要小,存在的话,意味着这两条线段是不相交的,反之则为相交。于是我们可以将所有的l放入一个集合,所有的r放入另一个集合,利用multiset进行删除以及查找操作。每次操作后,都需要确定多集合中是否存在一对不相交的线段。如果点 x 不存在,且 l
2023-11-28 22:56:24 859
原创 洛谷P3958 并查集做法详解
判断小鼠是否能够逃出,即是判断下方空洞与上方是否连通(也就是是否在一个集合内),一个与地板接壤的空洞,另一个超出奶酪高度的空洞,是连通的话就可以逃出去。
2023-11-20 11:05:29 323 1
原创 洛谷P1434 详细题解
思路:由于不同点出发的结果不同,所以需要遍历每个点出发的结果,并取最大值,这样的话情况就很多了,直接暴力搜索就会收获TLE。于是便需要用到记忆化搜索,简而言之就是已经搜过的点保存下来,再次搜到这个点时直接返回保存的值即可,大大降低了时间复杂度。
2023-11-17 19:48:55 387 1
原创 洛谷P3799 枚举题解
四根木棍拼成一个等边三角形,自然可以想到两根一样长,剩下两根加起来也为此长度即可。利用桶来存下各个从长度木棍的数量,两层循环枚举长度即可,外层循环枚举较长的那两根的长度,内层循环枚举第三边的其中一部分的长度,记得长度一定要为正数。以下是ac代码(附带。
2023-11-16 22:54:12 233 1
原创 洛谷P2089 深搜
深搜+枚举,大概框架是(已搜多少个数字,此时的和),若已搜到10个数且和等于要求,就结束。如果这道题是输出所有方案,再输出方案数,那么到此就结束了。但是,要求是先输出方案数,再输出答案,所以应该将答案存储起来,一个二维数组轻松搞定。以下是ac代码(附带详细注释)
2023-11-13 11:06:21 309
原创 洛谷P2431 非位运算做法
这是一道比较典型的贪心题,因为月饼是从轻到重的,又要吃的数量最多,那自然是越轻的先吃啦!而恰好每个月饼的重量都是2的i次方,那自然可以联想到用二进制来做,但博主位运算学的稀烂,于是乎用一个数组来保存一个数转化为2进制后的结果,由于题目要求最少要吃A,那我们就以A转化为二进制的数组为基准来“吃”,要吃某个位置的月饼就让数组这个位置的值为一就好,从低往高不断置一,到超过B时停下就行啦!纪念一下洛谷ac的第一道绿题。纪念一下洛谷ac的第一道绿题。以下是ac代码(附带。
2023-11-10 23:22:33 97 1
原创 洛谷P1077的最优背包做法
都算出这个了,不妨再观察一下?每一次用到的数据都是(i-1)时候的数据,那么直接利用滚动数组进行优化,就是只需要保留现在的状态以及上一次的状态,想到这已经变成一维的了,这个优化的过程不正是01背包的优化过程吗(✌,那么话不多说,直接上ac代码(附带详细注释)思路:要种下这种花的总方案数量等于种下这种花(0-max)朵时的方案数之和(max为这种花的。总数量),在此思考上,可以很容易得到状态转移方程为。
2023-11-08 19:16:57 73 1
原创 输入两个正整数A、B,求A+B的值。
这么大数字无法直接存储,那么我们可以把数字的每一位存在数组里,然后模拟竖式计算,这样无论多大都能存下来。由于直接用int类型数组没办法很好的分别存这两个数,所以可以考虑字符数组,它会自己将两个数分开,然后再转为int类型即可。此外,还需要考虑的是进位的问题,众所周知竖式计算当某一位大于9时,便让下一位+1,这一位-10,所以我们在模拟的过程中自然需要考虑进位。,例如10的200次方等等。看到这个标题,肯定认为这是一篇水文罢,但其实不然,因为这里的A和B可以。
2023-11-06 12:04:08 717
原创 洛谷P1090 STL做法
要想总的力气最小,那每次的力气自然都得最小,简单来说就是每次都把两堆最轻的合并,那么第一想法是把所有果子的重量存在数组里,每次合并完果子就sort一下,然后合并数组前两个元素即可,但很显然,这样只能过部分点,其余都TLE。所以必须要改进一下。实际上不需要每次都重新排序,只需要将上次合并后果子的重量插入到合适的位置,使得整个数组仍为递增序列即可。实现轻松插入一个元素,那vector自然是首选。使用一个lower_bound函数即可。看到这可以自己试着解决一下!以下是ac代码(附详细注释)
2023-11-05 15:06:30 71 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人