- 博客(23)
- 收藏
- 关注
原创 2017 ACM-ICPC Asia Xi‘an Regional Contest J - LOL
枚举我方前四个选手,第五个可以推出来,我方ban和对面选和ban可以直接组合数算出来。
2024-07-31 22:46:42 211
原创 The 2023 ICPC Asia Hangzhou G题
维护一个dw数组,表示蛇初始状态时,每个点到尾巴的距离,例如一条长度为3的蛇,从头到尾依次是 (1,1),(1,2),(1,3)当一个点搜到了蛇初始状态的某个点时,就要判断,蛇尾离开没,如过离开了就是上述情况1,否则是情况2,3。一条蛇,满图跑,dp状态太多,只能搜索,分析一下时间复杂度,发现每个点最多出队一次,搜索可行!那么dw[1][1]=2,d[1][2]=1,d[1][3]=0,其余的都为0。因为其余的点必然是蛇头先到,不存在蛇尾有没有离开是情况,所以都设为0。其余细节:1.压维好写一点。
2024-07-29 23:13:18 260
原创 Paint Pearls
首先用双指针预处理出来b[][]数组,b[i][j]表示i到b[i][j]中恰好包含j种珠子。当然j<=根号m(珠子总数),因为如果>根号m了,还不如一个一个选划得来。后来喵了眼题解,发现可以用一个双链表代替预处哩,而且最快时间复杂度可以到o(m),但是极端情况也要到m根号m,题目也没说有多少组,这就很头疼。尝试从b[i][j](0<j<根号i)这个点来更新i号点,不重不漏考虑所有情况,时间复杂度m根号m。状态转移方程是:dp[i]=min(dp[i],dp[b[i][j]-1]+j*j)
2024-07-18 21:36:18 249
原创 codeforce ----- Nene‘s Magical Matrix
通过观察对角线上的数(左上到右下),发现每个数的下面和右边都是完美排列(12345)的一部分-->只要能够让对角线上的每个数的下面和右边都满足是完美排列(12345),那么就可以构造出该矩阵-->假设依次操作从左上到右下对角线上的每个数所在的行和列,发现操作下面的数会更新上面已更新过的数,这是不希望出现的-->从右下往左上操作则不会,利用贪心的思想,在满足操作要求的所有矩阵中,最大的数出现的最多,次大的数出现得次多......的矩阵的和最大,那最大的数最多出现多少次呢?矩阵最大和是多少,每次该如何操作。
2024-04-24 15:02:55 275
原创 算法提高 —— 深搜中的重难点总结
相比bfs,迭代加深随着深度限制的增加,虽然会重复搜索到搜过的部分,但是却是可以忽略不计的(举个例子,假如搜索数是一颗二叉树的形式,假设答案在第n层,前面的所有节点加起来也才2^n-1,跟第n层所有节点差不多,但是一般题目的搜索树每个节点不可能只有两个子节点,那么重复搜索的部分就更不值一提),而bfs搜的话,可能会出现搜索节点过多导致爆空间。缺点是可能会出现答案在搜索树层数很浅,在靠后的子树中,但由于搜索次序需要遍历完一棵搜索树所有的节点,所以导致效率低下。这样的搜索树很可能会使在bfs的过程中队列爆掉。
2023-10-16 14:51:55 191 2
原创 Acwing 180.排书
被题的难点就是找估价函数,因为每次最多会断开三个相连的位置,所以每次最多会将三个错误的位置修正(每次都要算出改状态的错误位置有几个),假设当前有tot个错误链接,则最少需要tot/3(上取整)次操作,所以估计函数f()=tot/3(上取整)=(tot+2)/3(下取整)。给定一个1~n的随机序列,每次操作可以任选一段序列移出来放到某个位置的后面,如果能在4步操作之内把该序列变成1~n的升序则输出操作步数,否则输出“5 or more”
2023-10-16 14:50:53 113 1
原创 Acwing 171.送礼物
思路:因为此题w的范围为[1,2^31-1],故不能用背包去解,因为1<=m<=46,可以想到用dfs,但一般的dfs肯定会超,所以想到可以用双向dfs,先搜前一半,打个表,把所有的情况都列出来,再搜后一半,当搜到第m个时,再利用二分去表中查找第一个<=(w-当前后一半的重量),记录下最优解。有m个礼物,给定每个礼物的重量,在重量不超过w的情况下,求最大的重量。算法标签:双向dfs。
2023-10-16 13:42:10 109 1
原创 Acwing 170.加成序列
思路:因为涉及到了最短,如果用普通dfs的话,则需要把整颗搜索数都遍历一遍,因为不知道当前解是否最优,当然可以加一些剪枝,但是它的效率还是不如迭代加深,故用迭代加深去解,迭代加深就是给定一个深度限制的dfs,具体看代码注释。题目大意:已知一个序列的开头(一定为1),结尾(输入),序列的中的每一个数都是该数之前的任意两个数相加(可以是同一个数),并且保证序列严格单调递增,求该序列长度最短的解,并输出序列中所有的数(有多组解的话任意输出一组)
2023-10-16 13:10:30 116 1
原创 Acwing 165.小猫爬山
思路:按体重从大到小枚举每只小猫(优化搜索顺序),每只小猫有两种选择,可以选则加入之前的缆车,如果可以加入的话(可行性剪枝),也可以选择自己额外开一辆缆车。当枚举到最后一只的时候,更新一下res,如果搜索过程中,当前缆车数量已经>=res,直接返回(最优性剪枝)我的理解是:如果先搜大的,后面就只能搜小的,如果先搜小的话,后面即可以搜大的也可以搜小的,这样搜分支显然比先搜大的多很多,所以先搜大的能够优化搜索。题目大意:已知一辆缆车的最大承受重量和m只猫的重量,求最少需要多少量缆车。
2023-10-16 11:12:11 125 1
原创 Acwing 1117. 单词接龙
题意:给定m(m<20)个字符串,如果一个字符串是另一个字符串的非平凡后缀,则可以将此字符串连接在另一个字符串的后面,公用重叠的部分,这个新的字符串称之为“龙”,求龙的最长长度,每个字符串可用两次。link[i][j]=len表示第i个字符串与第j个字符串有公共部分,长度为len。其中第一个参数表示当前的“龙”,第二个参数表示上一个字符串的下标。预处理完后,dfs首字母为所给字母的字符串,结果取max。思路:由于m<20,所以很容易想到暴搜。
2023-10-09 23:57:04 62 2
原创 算法题高 —— 宽搜汇总
在广搜中要想保证答案正确,就必须保证队列中元素的具有两端性和单调性(单调递增),如果队列中前面的元素大于后面的元素,则不能保证搜出来的答案最优,一般的广搜权值都是1所以就正常插入队尾就能保证队列的单调性和两端性,当权值有1和0时,如果还一股脑插入队尾,则不能保证队列的单调性,假设a和b为队列中前两个元素,d[a]=d[b]=x;a先出队,搜到的下一个点的权值为1,将x+1插入队尾,在让b出队,假设b搜到的点权值为0,则插入队尾的值为x,x+1>x,所以该队列不是一个单调递增的队列,不能保证答案的正确性。
2023-09-22 14:24:32 89 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人