
经典算法
西瓜君wtml
这个作者很懒,什么都没留下…
展开
-
紫书8.2.2 快速排序
划分问题:把数组的各个元素重排后分成左右两部分,使得左边的任意元素都小于或等于右边的任意元素。 递归求解:把左右两个部分分别排序。 合并问题:不用合并,因为此时数组已经完全有序。 参考:http://blog.youkuaiyun.com/morewindows/article/details/6684558实现代码:#include <bits/stdc++.h>using namespace std;原创 2017-08-25 06:17:24 · 210 阅读 · 0 评论 -
Dijkstra算法
最短路问题:针对无向图,正权值路径,采取Dijkstra算法。 首先记录每个点到原点的最短距离,这个距离会在每一轮遍历的过程中刷新。第一轮,可以计算出,2,3,4,5,6到原点1的距离分别为:[7,9,INF,INF,14]。INF表示无穷大。取其中最小的,为7,可以确定1的最短路径为0,2为下一轮节点。同时确定2的最短路径为7,路线:1->2。第二轮,取2节点为前驱节点,可以得到3,4,5,6节原创 2017-10-24 16:12:14 · 188 阅读 · 0 评论 -
扩展欧几里德算法
最近做了两道扩展欧几里德算法的题。 写一下自己对扩展欧几里德算法的理解。 扩展欧几里德算法用于求解ax+by = c 求ax+by = c, 令d =gcd(a,b); 那么(a / d ) * x + (b / d )* y = c / d 如果c不是d的倍数,则方程无解 如有解,则方程得到其中一个解 x0 = x*c/d 方程的最小整数解 公式 (x0%(b/d)+(b/d))%(原创 2017-09-17 09:04:03 · 238 阅读 · 0 评论 -
埃氏筛法与欧拉筛法
素数的个数给定整数n,请问n以内有多少个素数?摘自挑战程序程序设计。要枚举n以内素数,可以用埃氏筛法。这是一个与辗转相除法一样古老的算法。首先,将2到n范围内的所有整数写下来。其中最小的数字2是素数。将表中所有2的倍数都划去。表中剩余的最小数字是3,它不能被更小的数整除,所以是素数。在将表中所有3的倍数都划去。以此类推,如果表中剩余的最小数字是m时,m就是素数。然后将表中所有m的倍数都划去。像这样反原创 2017-09-07 22:26:40 · 487 阅读 · 0 评论 -
活动安排问题
1428 活动安排问题基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室? Input 第一行一个正整数n (n <= 10000)代表活动的个数。 第二行到第(n + 1)行包含n个开始时间和结束时间。 开始时间严格小于结束时间原创 2017-08-20 09:27:45 · 489 阅读 · 0 评论 -
二分查找求上界和下界
今天做题遇到了一题求下界的题。 把二分查找求上界和下界复习一遍。代码实现:#include <iostream>using namespace std;int main(){ int a[10]={0,1,1,2,3,3,3,3,5,6}; //找3的下界 int l=0,r=9; int ans; while(r>l) { int原创 2017-09-16 11:03:10 · 835 阅读 · 0 评论 -
【算法入门】深度优先搜索(DFS)
深度优先搜索(DFS)【算法入门】郭志伟@SYSU:raphealguo(at)qq.com2012/05/121.前言深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法。它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念。你可以跳过第二节先看第三原创 2017-08-29 07:42:09 · 474 阅读 · 0 评论 -
离散化思想
转载请注明出处:http://www.cnblogs.com/kevince/p/3893531.html ——By Kevince最近做了一些需要离散数据的题目,比如URAL 1019 以及POJ 2528等,由于数据较大,如果用传统的方法建立对应的数据结构消耗的内存和时间肯定是不能被接受的。由于以前没有怎么接触过需要离散化的题目,于是就通过自己最近的做题经验以及网上的部分资转载 2017-07-28 20:11:39 · 355 阅读 · 0 评论 -
紫书8.2.1 归并排序
按照分治三步法,对归并排序算法介绍如下。 划分问题:把序列分成元素个数尽量相等的两半。 递归求解:把两半元素分别排序。 合并问题:把两个有序表合并成一个。代码:void MergeSort(int A[],int x,int y,int T[]){ if(y-x>1) { int m = x+(y-x)/2; int p=x,q原创 2017-08-24 16:04:31 · 303 阅读 · 0 评论 -
再次理解 归并排序
归并排序:先对两个有序的系列进行合并,合并的时候不断的对两个系列的第一个元素进行比较,把较小的那个移动到最前面成为了第一个元素,那么移动的元素后面的元素就是成为了下次比较的序列的第一个元素,如此不断的取两个系列的第一个元素进行比较。1 4 5 6 2 7 8 9 第一轮1与2比较 1比2小, 那么1被移动了 4成为了下次要比较的元素了那么下一轮就是比较4和2 2小就被原创 2017-09-06 10:24:51 · 191 阅读 · 0 评论 -
KMP算法初学next数组
参考:http://blog.youkuaiyun.com/to_be_better/article/details/49086075 讲解的很详细例题:51nod 1277一个字符串的前缀是指包含该字符第一个字母的连续子串,例如:abcd的所有前缀为a, ab, abc, abcd。 给出一个字符串S,求其所有前缀中,字符长度与出现次数的乘积的最大值。 例如:S = “abababa” 所有的前缀如下:原创 2017-08-27 10:58:56 · 303 阅读 · 0 评论 -
莫比乌斯反演的学习
**参考:**[这里写链接内容](http://blog.youkuaiyun.com/lixuepeng_001/article/details/50577932%29) 前两天学习了一下之前一直觉得高大上并且想学的内容——莫比乌斯反演。不过学任何东西都是一样,学会了发现也就这样,虽然只是皮毛。OK,废话不多说,进入正题,今天我用杭电的1695这道题再来温习一下莫比乌斯反演。 HDU1695的题原创 2017-08-26 09:22:51 · 276 阅读 · 0 评论 -
区间覆盖问题
区间覆盖问题.数轴上有n个闭区间[ai,bi],选择尽量少的区间覆盖一条指定一条线段[s,t]。#include <bits/stdc++.h>using namespace std;const int maxn = 1e5+100;typedef long long LL;typedef pair<LL,LL> p;p seg[maxn];vector<p> vec;vector<p>原创 2017-08-25 15:33:14 · 473 阅读 · 0 评论 -
选择不相交区间
选择不相交区间。数轴上有n个开区间(ai,bi)。选择尽量多个区间,使得这些区间两两没有公共点。贪心策略:首先明确一个问题:假设有两个区间x,y.区间x完全包含y,则选择x是不划算的,因为题目要求选择尽量多个区间,选择y给其他区间留出了更多的位置。 按照终点从小到大排序,选择第一个区间。之后把所有和区间1相交的区间排除在外。O(n)扫一下即可。 例题:不重叠的线段 http://www.51n原创 2017-08-25 09:43:57 · 949 阅读 · 0 评论 -
区间选点问题
区间选点问题。数轴上有n个闭区间[ai,bi]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)。贪心策略:把所有区间按终点从小到大排序(b相同时a从大到小排序),则如果出现区间包含的情况,小区间一定排在前面。第一个区间应该取最后一个点。 参考:http://blog.youkuaiyun.com/dgq8211/article/details/7534776 代码:#includ原创 2017-08-25 09:37:40 · 1717 阅读 · 0 评论 -
二分图的最小顶点覆盖 最大独立集 最大团
二分图的最小顶点覆盖定义:假如选了一个点就相当于覆盖了以它为端点的所有边。最小顶点覆盖就是选择最少的点来覆盖所有的边。方法:最小顶点覆盖等于二分图的最大匹配。我们用二分图来构造最小顶点覆盖。对于上面这个二分图,顶点分为左右两个集合,X集合包含1,2,3,4,Y集合包含5,6,7,8,9.假如现在我们已经找到一个最大匹配M,就是上面的红线所标注的M={(1,7),(2,5),(4,8)}。我们作如下定原创 2018-02-21 22:46:30 · 500 阅读 · 0 评论