随笔分类 - Algorithms
摘要:一.Olympiad in Programming and Sports - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) (1)题意: (2)解题思路 考虑按编程能力从大到小排序,先选完编程团队中的p个人,然后再考虑体育团队的s人, 考虑维护3个优先队列,一个是a[i]的大根堆,一
阅读全文
摘要:一、模拟退火 模拟物理的金属退火,使某一个状态慢慢趋于稳定,与爬山算法相类似的一类求解近似解的问题。 二、算法里的公式 若迭代出的解一定优于当前解,则当前解被覆盖。而当迭代的解不优于当前解得时候,我们用一个概率去接受它。 e^df/kT k为常数,编程中常常设置为1 T为温度 e为指数函数 df为负
阅读全文
摘要:一、Bellman-Ford算法 1.定义 Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径,它和Dijkstra的不同点是,它能计算带有负权边的最短路,而Dijkstra不能计算,而且它能判断负环的出现。 2.实现 先看张图(小圈为边的编号) 我要从1到5 1.首先初始化dis
阅读全文
摘要:一、Tarjan算法 与其说Tarjan是一种算法,不如说Tarjan是一种思想,利用这种思想我们可以求强联通分量(scc)、割点/边、缩点等问题,接下来我们就来说一下Tarjan是怎么解决以下几个问题的。 二、SCC 1.什么叫SCC? 定义就是在一个图中,如果任意两个点能够互相达到,那么就称几个
阅读全文
摘要:一、关键路径算法 关键路径算法是在工程能完成的情况下找出关键的几个活动,达到工程更早完成的效果。 二、算法分析 这个算法中我们需要用到etv,ltv,ete,lte这几个变量,还需要用到确保工程能完成的算法,也就是拓扑排序算法 在这个算法中我们把顶点看作是事件,边权看作是活动持续时间,边看作是活动
阅读全文
摘要:一、拓扑排序(TopologicalSort) 所谓拓扑排序,就是指在一个有向无环图中,每个顶点都有出现的顺序,然后使得每个顶点都能出现。这里顶点可以看成是一个活动。 比如说我们要准备学校的运动会 首先我们要干嘛。。。 其次我们才能干嘛。。 。。。。。。。。。。 。。。。。。。。。。 最后我们才能干
阅读全文
摘要:一、最短路径算法 1.Dijkstra(迪杰特斯拉)也叫作单源最短路径算法 2.Floyd(弗洛伊德)是个多源最短路径算法 二、Dijkstra算法(采用贪心思想) 1.产生 当我们要计算两个确定的点之间的最小成本的时候,我们就能用到这个算法,比如说我们要从长沙去到北京,可以直达,也可以转车,但是你
阅读全文
摘要:一、Prim算法 Prim算法时间复杂度为O(n ^ 2) Prim算法的具体思路是,每次根据最小那条边的顶点松弛边,然后再根据dis数组继续松弛,一直到n-1条边数完。 优化后的时间复杂度为O(nlogn) 1 #include "bits/stdc++.h" 2 using namespace
阅读全文
摘要:一、题目描述 二、解题思路 并查集+快速排序 快速排序把时间少的放在前面,因为要最少时间修好,一共有n个村庄,所以只需要n-1条边即可通路,利用并查集判断是否可以达到同一个村庄,相当于需要增加1条路,当路的条数等于n-1时,便修好了。否则如果在m组公路中无法修好,那么输出-1即可。 三、代码实现 1
阅读全文
摘要:一.前言: 经过昨天对kmp的复习,以及做了一道模板题,于是就产生了对多字符串匹配算法AC自动机的好奇心。今天一早就开始学习ac自动机,下午调试了一个小时便实现了该算法。首先来介绍一下什么是ac自动机, 所谓ac自动机,并不是自动判题的机器,而是一种多模式匹配算法,我们都知道kmp算法是每次只能对一
阅读全文
摘要:一、描述: BF、KMP、GKMP(优化后的kmp)都是基于单个字符串(多个字符串一般要用到其他算法,比如说AC自动机)匹配的算法,不过时间复杂度各有不同,其中BF的时间复杂度为O(n * (m - n + 1)),而kmp算法的时间复杂度为O(n + m),可见快上了不少,但是这其中确实还是有不足
阅读全文
摘要:回溯基本思路 问题解析解决回溯问题,实际上就是一个决策树的遍历过程其核心就是for循环里面的递归,在递归调用之前做选择,在递归调用之后撤销选择解决思路1.路径:也就是已经做出的选择2.选择列表:也就是你当前可以做的选择3.结束条件:也就是达决策树底层,无法再做选择的条件 回溯三部曲1.递归函数返回值
阅读全文
摘要:一.埃氏筛: 埃氏筛就是利用每个数的合数一定不是素数,用空间换取时间,筛选出一定范围内的素数。(合数:就是某个数的倍数*2,*3......这种) 代码实现: 1 #include <stdio.h> 2 #include <stdlib.h> 3 int a[1000000]; 4 int mai
阅读全文
摘要:1 #include "stdio.h" 2 int main() 3 { 4 int target = 7; 5 int nums[6] = {2,3,1,2,4,3}; 6 int numsSize = 6; 7 int point1,point2; 8 long long int sum =
阅读全文
摘要:证明(m * n) % c = (m % c * n % c) % c 设m = ic + p 设n = jc + q 左式等于((ic + p) * (jc + q)) % c 化简得(ijc^2 + iqc + jpc + pq)% c = pq % c 右式等于((ic + p) % c *
阅读全文
摘要:一.题目描述: 二.题目解析: 刚开始一直以为最多只有两个相同个输入字符串,后来意识到看错题了,就开始改,第一遍写重叠个数那个循环的时候从尾巴到头,全wa,第二遍写从头到尾,对三个T三个,第三遍写了个剪枝ac,这个题的思路其实是很简单的,只是实现的时候比较复杂,然后容易出错(调了两个小时)>0<!这
阅读全文
摘要:一.题目描述: 二.解题思路: 首先建立一个数组记录流星砸下的位置以及时间,当有相同地方砸下的流星时我们只取最小的那个时间,然后从0,0开始进行bfs即可,如果不能走了,说明Bessie逃不出去,如果他在走的过程中碰到了一个没有被砸过的点,那么这个点一定是花费最小步数的安全点。唯一需要注意的是,流星
阅读全文
摘要:一.题目描述: 二.解题思路: 刚开始用的打印图形的解法做T了一个点,后面意识到不需要打印图形那么麻烦的操作,直接用一维数组下标代表行号,值代表列。每次选择一列的时候,要判断是否符合。 条件有四个 1.和前面已放置好的皇后不处于同一行 及f!=i,这个条件不需要手动判断,因为你递归的时候已经是往下选
阅读全文
摘要:一.题目描述: 二.解题思路: 从1开始往下dfs就行了,但是每次循环的开始必须要大于等于前面选择的那个数就ok了。 三.代码实现: 1 #include "bits/stdc++.h" 2 using namespace std; 3 int a[10] = {0}; 4 void dfs(int
阅读全文
摘要:一.题目描述: 二.解题思路: 刚开始一直有个错觉,以为左右脑做个贪心就可以了,一交全wa,????,不信,再交一边,又全wa,然后我突然想到了以前学dp的时候,做过一个类似于求解数组分成两部分求和最小题目,这个应该就是那个题目的变形,然后我就开始上模板了,一顿cv,交上去莫名ac。 三.代码实现:
阅读全文