North School && clear algorithm data structure DAY1-- knowledge finishing Bellman-ford algorithm and algorithm SPFA thought Detailed and forfeit the right to ring (negative cycles)

Brief:

  Major topics Today partition (mainly half), doubled, greedy, search, and chaotic into the hill-climbing algorithm and simulated annealing (Khan ...)

First, the points (er) rule (fen):

  Half is in OI in the extensive use of the idea, just give some examples, it is enough to detect the use of half the breadth: binary search, binary answer; merge sort, quick sort; segment tree, binary search tree; 0-1 linear programming and with an algorithm-half recurring problem. As for partition, it is a kind of magic can be combined to solve the problem.

  For a satisfying dichotomy of questions, we can consider two divided to it. Dichotomy is the essence of the existence of a monotonic or critical point:

    Monotonicity: possible answers in whole or in certain intervals is monotonous, it is possible for this interval half, to find the optimal answer to this range.

     

    Critical point: the feasibility answer mutations occur suddenly at a certain point, that all possible answers painting a line, it will be obvious to find a boundary point, the data are feasible left and the right are not feasible. And that solution is to limit the general optimization problem we are looking for. So the essence of the answer is also half the boundaries to find a method of dichotomy.

  

  Ordered by half the interval of each treatment regarded to be processed reduced by half, to the complexity of the fast O (log n), and to the optimization problem into a problem of determination , together with some other algorithms, as many of the most optimization solution - add a possibility. In fact, some words can make people aware of certain questions can be half ( to be sensitive to these words, some questions did not say so directly, to be able to see it ):

      Smallest maximum value;

      Minimum maximum;

      Orderly;

      fraction;

      time complexity;

      ……

Sometimes encounter something that looks like half the problem, you can hit a table look meets dichotomy.

  A simple template:

 

  (Judge determine the boundaries of the current function can enumerate the mid possible. If feasible explanation mid likely is the final answer, but also may have a better answer, do not forget to record it)

To see a simple question:

(Entry title ...) see the "minimum maximum", to be sensitive Oh.

  二分最小的最大值mid,接着用贪心扫一遍判定一下能否分成最大值小于mid的m(m<=M)段就行了。

  直接求可能有些难度,但看到“请你设计一种方案,使得复制时间最短。复制时间为抄写页数最多的人用去的时间”,这不就是“最大值最小”的另一种说法吗?,所以还是要对二分的关键词敏锐些!考虑二分答案,二分最小的最大值,从后往前扫一遍用贪心判定就行了。  

二分的一般思路即为:确定要二分——要二分什么——判定什么——怎么判定(用什么算法)。

 

  一个最优化问题,可以考虑一下二分。显然要二分能组成的套牌数mid,判定能否用当下的牌组成这么多的套牌。记录每种牌到mid不足量的和sum。显然每种牌的不足都要靠joker来补足。首先发现每套牌最多只能有一个joker,所以sum应<=mid,否则判定结果为false;还发现joker最多只有m张,所以sum应<=m,否则判定结果为false。只要上面两个条件都满足,我们就可以用当下牌组成每套牌最多只有1个joker的mid套牌。

  放在U盘中的文件的最大l即为接口大小+“最小需要多大的接口”=最大值最小!考虑二分答案。二分最小的接口大小mid,把文件按大小从小到大排个序,将所有大小小于mid的物品做一个01背包,看看能否满足最大总价值不小于p即可。

  可先跑一遍广搜判断有无解以及从1到n的最少经过几个电话线杆以得知能否直接被电信公司报销全部费用。如不有解且不能报销全部费用的话,再更深地思考一下。又发现了“最大值最小”这一主题,再考虑二分。二分总费用mid(因超过k条而不被电信公司免费的最长的电话线长度),此时长度小于等于mid的电话线可以尽情搭,而大于mid的电话线则全让电信公司给免费(若小于k条的话),故可以把所有边权<=mid的边的边权都修改为0,大于mid的都修改为1,跑一遍最短路(边权只有01的最短路可用双端队列的广搜实现)。若得到的最短路径长度len<k,则说明电信公司还可再多给免费几条电话线,mid还有可能更小,记录答案后在r=mid-1;若len==k,说明刚好把需要的能免费的电话线都免费了,输出mid即可;若len>k,说明“免费超额”了,要把mid改大点,即l=mid+1。

 

讲点有趣的东西吧。如何生成一个最优比率生成树?

  

二分的一个十分优雅又不失尴尬的考法(。。。),这也是为什么碰到分数可以考虑二分的原因。以最大为例,设最终答案为ans,则所有大于ans的可能答案都不会有一个生成树满足条件,而小于ans的可能答案总会被一个生成树的答案大于,发现ans即为一个界限,可以用二分。这里二分答案k,即要判定是否存在一个生成树使∑(benifit[i])/∑(cost[i])>=k,让k尽可能大、尽可能去接近最终答案就好了。

      由于具有重大的现实意义,不妨假设cost都大于0。

      则∑(benifit[i])>=k*∑(cost[i]);

      再变一下:k*∑(cost[i])-∑(benifit[i])<=0;

        ∑(k*cost[i])-∑(benifit[i])<=0;

        ∑(k*cost[i]-benifit[i])<=0;

  看到这里是不是就懂了?只要我们再把所有边的边权变为k*cost[i]-benifit[i],再跑一遍最小生成树,把权值之和与0比较,若<=0则判定为true,否则为false。

 以后对于类似的分数最优化,都可以用类似的变形随便变变,尝试用二分做。

  平均乐趣值最大,实际上就相当于总收入/总花费最大。

  小技巧:对于一个既有边权又有点权的有向图,我们可以把点权挪到边权上去。因为我们一旦踏上某条边,这条边的终点我们一定也会经过。而对于这道题来说,尽管每个点的点权只能被加一次,可是考虑一下八字形的情况(即有点重复经过多次的代表),这种情况实质上是由多个环组成的情况。由于题目要求的分数是一种平均数,易知组成那个八字形的两个环中一定有一个环的   一定。故这题又是分数规划,思路跟楼上非常像,不过最优比率生成树变成了最优比率环而已。而对于判是否有环的权值和为负(为0的情况不管也没什么啦),这不就是判负权回路吗?bellman-ford与spfa任君选择。。。

  关于bellman-ford以及进阶的spfa,您可以看看作者的另一篇博客:Bellman-ford算法与SPFA算法思想详解及判负权环(负权回路)

二、倍增:

  跟二进制有着密切的不可告人的联系,看见二进制及2的k次方,想想倍增准没错!

  常用于快速幂、快速乘(明明一点都不快)、快速矩阵乘法(主要还是矩阵快速幂)、倍增求...(LCA出现居多)。

  1、快速幂:我们算a的b次方模p的值。一般是O(n)算法乘一波,当b特别大时显然不行。考虑将B二进制分解,就可O(log n)算出结果。

  2、快速乘:

  

  这就没了??(心里一句***)

  果然关键时刻还得靠大佬:O(1)快速乘 - 紫芝的博客 - CSDN博客

  3、矩阵乘法:用于求一类常系数递推方程,这也是矩阵乘法的一个主要用途了。简单的说,对于一个一次的常系数递推方程(如f(n)=7*f(n-1)+2*f(n-2)+5)(目前只会这个QAQ)计算f(n),一般算法都是O(n)的递推,但当n特别大时肿么办?

  我们竖着写一个m*1的矩阵a,第i行分别为方程中去掉系数的第i项,如果为常数则写为1(比如这里的an-1的三项从上往下分别为f(n-1),f(n-2),1)。都知道矩阵乘法是一个n*k的矩阵乘一个k*m的矩阵得到一个n*m的矩阵,而矩阵乘法不满足交换律,但满足结合律和左右分配率律。只要我们在矩阵a左边写一个矩阵j(称为转换矩阵),要求j*a能得到下一个a(即f(n),f(n-1),1),从最开始的a0开始,每被j乘一次ai就变成ai+1,由矩阵的结合律可知,只要算出j的n次方(用快速幂,若要取模,直接对矩阵每一项取模就行)后再与a0相乘得到an,答案就为an的第一项。时间复杂度从O(n)进化为O(log n)。

  4、倍增求LCA:快速地(O(log n))求树上的最近公共祖先,以迅速处理树上的路径问题(dis(u,v)=dis(u,root)+dis(v,root)-2*dis(lca(u,v))。

看题喽!:

  转换矩阵为:

      1 1

      1 0

 

 

  如果对于每一支军队都做一遍所有指令后再看下一个军队,显然会超时。为什么?是不是我们看待军队的角度不对?如果我们把军队i写作一个矩阵:

  

xi
yi
1(有常数参与矩阵乘法时常常需要个1)

  同时对于三种操作,也可以写出相应的矩阵:  

  操作1:

1 0 p
0 1 q
0 0 1

 

  操作2:

-1 0 0
0 1 0
0 0 1

  操作3:

1 0 0
0 -1 0
0 0 1

  因为所有军队收到的命令相同,又有矩阵乘法的结合性,故可将所有操作矩阵乘起来得到一个结果矩阵,在用这个结果矩阵分别去乘每一个军队对应的矩阵就得到答案了。时间复杂度O(n+m)。

矩阵的另一个大用途就是把一堆让人头疼的东西抽象化。只要抽象化成一个数学结构,问题一般就好解了。

 

  显然可以用递推方程做,但发现方程不好写。为什么不好写?主要还是因为对不同范围的数,对应的方程和转换矩阵也不太一样。先不要放弃,分段考虑尝试一下,惊奇地发现转移矩阵竟可以用一种方法表示出来:

  

 

 

只要看到异或,我们就应该想到一个数异或自己等于0(凭此据说可以用三次异或来交换整形变量),一个数异或0仍等于它自己,且异或满足交换律、结合律与分配律。类比求树上两点间的路径长度dis(u,v)=dis(u,root)+dis(v,root)-2*dis(lca(u,v),不过在这里设dis(u,v)为两点间路径上所有边权的异或值。发现公式改成dis(u,v)=dis(u,root)+dis(v,root)就行了!因为dis(u,root)+dis(v,root)相较于dis(u,v)只多了2个dis(lca,root),然而dis(lca,root)异或下自己就等于0了,所以最终结果仍是dis(u,v)。所以只要处理出每个点到根root的路径上所有边权的异或值就行了。

  容易知道选的点一定是三个点的两两LCA的其中一个。直接求三遍lca到三点的距离,去最小值就好了。

三、贪心

   

  贪心策略的证明:枚举所有情况,都不会比它更优了。

  

  非常简单的贪心:先合小的。搞一个小根堆就好了。

  //(dms正解:维护哈夫曼树???)

  

四、搜索

 

EX.1、爬山算法

 

EX.2、模拟退火

 

 

继续看搜索

 

Guess you like

Origin www.cnblogs.com/InductiveSorting-QYF/p/11240846.html