そして、昨日話します
川の問題
AB CDが最も遅い人で、最速の男とみなされ、二人は川を渡ってCDを残して、2つだけの解決策があり、4人が関与し、の元の問題の大きさN N-2及びサブスケールにそれを回しました問題
4人が直接、ちょうど練習のような方法で従事している場合、最後の2例は、3に対して4は、それが3人の場合は、2つのオプションがあり、1は前後に送信され、一つはありますABで動作し、分ように両者の間に取られます
二つの点に焦点を当てたタイムシェアリングの使用で貪欲アルゴリズムの嘘:
貪欲アルゴリズムが失敗した解決方法1.?
2.どのように彼らの暴力的なアルゴリズムを強化するために貪欲なアルゴリズムを使用するには?
ランダム化アルゴリズムと組み合わせる1.貪欲アルゴリズム(例えば、シミュレーテッドアニーリング)
意思決定を行う際の方向の現在の状況よりも悪い受け入れる確率
現在のソリューションのうち一定の確率に検索結果には、貪欲再起動すると、
貪欲は、ランダム貪欲開始点を複数選択、いずれ最小初めに
検索アルゴリズムと併せて2貪欲アルゴリズム
答えを計算するには、ある程度のサブ最適なソリューションを選択することで、最適な検索戦略をK-
小規模後に検索を開始するために、パックの広い範囲で貪欲な検索戦略、貪欲(貪欲剪定)と組み合わせること
分治:
分割し、分割統治、分裂を克服し、征服、分割統治法いくつかの小さな規模の問題には大きな問題であり、それらを解決し、最終的にはサブ問題を解くことによって、全体的な問題を解決します。
除算を使用し、主に二つの側面にOIでアルゴリズムを征服します:
バイナリ検索に基づいて、使用の三分の二を見つける1
2.タイトルの使用は、より細かい部分問題に分割して
私たちは、オーダーのこれらの二つの側面を説明します
二部性質である:ソート範囲内で決定された境界他方の側が満たされていないが、素子の境界面は、特定の特性を満たします。
そのため、以下の2点が、多くの場合、問題の種類を使用している解決するために:
1.単純なバイナリ検索
2.バイナリ回答(すなわち、特定の特性を満足する最大の価値を求めているの単調関数)
3.最も値の最も値(ハーフタイトルの最も一般的なタイプ)
差動プレフィックスカナダの半分
あなたは今、小さなB CNTB自然数に、小さなA CNTA自然数を与える必要が
小さいながらも自然数には、xで割り切れることはできません
同様のY Bで割り切れるより小さい自然数とすることができません
最小の自然数の最大値はどのくらいです与える必要がありますか?
二項答えvは、理由のxで割り切れる数のことはありませんので、我々はできます
第1の数xは、分割が、BのYで割り切れません
再把 被 y 整除的数但不被 x 整除 给a。
然后剔除所有被 x*y 整除的数
剩下的数与 x 和 y 都互素,判一下能不能好好的分配就可以
三分
三分的难度要略低于二分(因为变出来的花样少)
三分的用处在于求一个单峰函数的最值
单峰函数,例如:
代码
如果函数不是单峰的该怎么办?
分块
分块算法相当于是一个对于线段树和树状数组算法的下位替代品
由于其算法简单粗暴十分好写故广泛地运用于骗分领域(滑稽
1.给出一个长度为n的数列,以及m个操作,支持区间加法,单点查询
把长为n的数组分成√n块,对其中某一个区间[l,r]进行修改
- l和r在同一块里 直接跑,复杂度不超过√n
- l和r在相邻的块里 直接跑,复杂度不超过2√n
- 其他情况 把l和r所在的块暴力增加,对中间的块打标记,复杂度不超过3√n
2. 给出一个长为n的数列以及m个操作,支持区间加法,并询问区间内小于等于某个数x的元素个数
每个块内部排序
- l和r在同一块里 直接跑√n
- l和r在相邻的块里 直接跑 2√n
- 其他情况 两边暴力中间二分√n logn+2√n
3. 给出一个长为n的数列以及m个操作,支持区间开方,区间求和
我们发现一个longlong范围的数最多六次开方就会变成0或1
我们如果某个区间里每个数都是0或1就不用管他了
复杂度o(n√n+6n)
记录color[i]表示下标为i的球的颜色
Pre[i]表示前一个颜色为color[i]的球的颜色(前一个颜色和i相同的球)
引理:
如果Pre[i]<x<i,那么[x,i]区间内只有一种颜色为color[i]的球
所以:
查询[l,r]中有多少不同的颜色
只需要查询[l,r]种所有pre[i]<l的i的个数
对于修改,只需要对每一种颜色开一个set,修改的时候用类似于链表的方式将后驱的pre指向前驱就好了
或者暴力改也可以qwq这个题修改比较水、
搜索
DFS
深搜,电风扇,大法师,回溯
是自己欺骗自己的好东西(滑稽)
较多用于走迷宫和树的遍历中(以及大名鼎鼎的网络爬虫)
虽然要利用栈进行递归但是不可思议地空间依旧比广搜小
一般结合强力的剪枝服用时有奇效
由于不需要搜索完所有的节点也能出一些结果,故在骗分界有广泛的好评
在寻找最优解的问题上基本被广搜吊打
BFS
杀人放火,居家常备,解决最优性问题有两把刷子
擅长答案在搜索树比较浅的位置时的情况
虽然名字叫广度优先搜索,但其实并不喜欢很宽的搜索树
状态的表示并没有深搜来的舒服
并没有很好的剪枝策略,垃圾节点一大堆
空间上完全被锤爆了,可以说是一点都没有考虑过内存的想法
最优解:广搜
T成狗:深搜
解个数:深搜
双向广搜
当你知道起点和终点时就可以使用的操作
能大大减少广搜扩展到垃圾节点
不过就算这样内存依旧表示很不友好
总的一句话,比广搜只好不差(当然代码量除外)
其实是有双向深搜和双向A*的,可是姿势太骚闪了自己的腰,并木有什么卵用
迭代加深搜索
算是广搜向内存妥协后的奇葩产物
先枚举深度,再dfs
骚气的结合了广搜和深搜的特点
和第一眼给人的逗比影响截然相反,迭代加深搜索在面对庞大的搜索树时往往表现出了值得信任的优异表现
能写出 more and more 骚气的操作
其实也是有迭代加宽搜索的,不过价值和他给人的第一印象一样不靠谱就是了
剪枝
常用的剪枝主要有以下几种:
可行性剪枝
最优性剪枝
记忆化搜索
搜索顺序以及代码细节
启发式剪枝
其实做题时想不想得到全靠脑洞,有没有效果全看缘分
剪枝一:如果在搜索的过程中体积小于0 或者当前半径或高度小于剩余要制作的层数(因为每层必须是相差1的,当前半径或高度小于要制作的层数,肯定不能制作完)就要剪枝.
剪枝二:当前剩下m层需要制作,可以预测制作这m层蛋糕最少需要多少体积,如果这个最少的体积还大于当前剩余的体积,那个这个不必继续搜索,所以要剪枝。
剪枝三:因为要求求最小表面积,如果当前枚举到的面积已经大于要求得的最优表面积,就要剪枝,但是这个剪枝还可以更优化,根据剪枝二的启发,如果当前枚举到的面积加上制作剩余m层蛋糕所要花费的最小表面积大于已经求得的最优解,那么剪枝。
剪枝四:因为体积必须为N,根据剪枝二,如果剩下m层蛋糕制作都按照最大的来,依然不能够使用完剩余的体积那么也要减掉。