
常用简单算法
Renaissancer
这个作者很懒,什么都没留下…
展开
-
算法代码:查找数组中第i小的元素
#include #include #include #include #include #include using namespace std;void swap(int *a, int *b){ int temp; temp = *a; *a = *b; *b = temp;}int Partition(int A[], int原创 2015-09-24 21:18:16 · 653 阅读 · 1 评论 -
网络流三·二分图多重匹配
描述学校的秋季运动会即将开始,为了决定参赛人员,需要统计分配比赛选手。已知班级一共有N名学生,编号依次为1..N。运动会一共有M项不同的比赛,编号为1..M。第i项比赛每个班需要派出m[i]名选手参加。根据统计,编号为i的学生表示最多同时参加a[i]项比赛,并且给出他所擅长的b[i]项比赛的编号。希望将每个学生都安排到他所擅长的比赛项目,以增加夺冠的可能性。同时又要考虑满足每项原创 2016-09-25 19:43:58 · 3837 阅读 · 3 评论 -
网络流二·最大流最小割定理
对于一个网络流图G=(V,E),其割的定义为一种点的划分方式:将所有的点划分为S和T=V-S两个部分,其中源点s∈S,汇点t∈T。对于一个割(S,T),我们定义净流f(S,T)表示穿过割(S,T)的流量之和,即:f(S,T) = Σf(u,v) | u∈S,v∈T举个例子(该例子选自算法导论):净流f = f(2,4)+f(3,4)+f(3,5) = 12+(-4)原创 2016-09-22 08:54:22 · 2040 阅读 · 0 评论 -
网络流五·最大权闭合子图
某班级决定举行一些班级建设活动。根据周内的调查结果,共列出了N项不同的活动(编号1..N),第i项活动能够产生a[i]的活跃值。班级一共有M名学生(编号1..M),邀请编号为i的同学来参加班级建设活动需要消耗b[i]的活跃值。每项活动都需要某些学生在场才能够进行,若其中有任意一个学生没有被邀请,这项活动就没有办法进行。班级建设的活跃值是活动产生的总活跃值减去邀请学生所花费的活跃值。原创 2016-10-13 23:33:15 · 935 阅读 · 0 评论 -
后缀数组一·重复旋律
我们知道一个音乐旋律被表示为长度为 N 的数构成的数列。小Hi在练习过很多曲子以后发现很多作品自身包含一样的旋律。旋律是一段连续的数列,相似的旋律在原数列可重叠。比如在1 2 3 2 3 2 1 中 2 3 2 出现了两次。小Hi想知道一段旋律中出现次数至少为K次的旋律最长是多少?输入第一行两个整数 N和K。1≤N≤20000 1≤K≤N接下来有 N 个整数,表示每个音的数原创 2016-11-07 11:23:44 · 915 阅读 · 0 评论 -
后缀数组二·重复旋律2
我们知道一个音乐旋律被表示为长度为 N 的数构成的数列。旋律可以表示为一段连续的数列,相似的旋律在原数列不可重叠,比如在1 2 3 2 3 2 1 中 2 3 2 出现了一次,2 3 出现了两次,如何知道一段旋律中出现次数至少为两次的旋律最长是多少?输入第一行一个整数 N。1≤N≤100000接下来有 N 个整数,表示每个音的数字。1≤数字≤1000输出一行一个整数原创 2016-11-07 14:55:41 · 572 阅读 · 0 评论 -
后缀数组三·重复旋律3
我们知道一个音乐旋律被表示为长度为 N 的数构成的数列。旋律是一段连续的数列,如果同一段旋律在作品A和作品B中同时出现过,这段旋律就是A和B共同的部分,比如在abab 在 bababab 和 cabacababc 中都出现过。如何知道两部作品的共同旋律最长是多少?输入共两行。一行一个仅包含小写字母的字符串。字符串长度不超过 100000。输出一行一个整数,表示答案。原创 2016-11-07 15:10:00 · 521 阅读 · 0 评论 -
网络流四·最小路径覆盖
H市一共有N个旅游景点(编号1..N),由M条单向游览路线连接。在一个景点游览完后,可以顺着游览线路前往下一个景点。为了避免游客重复游览同一个景点,游览线路保证是没有环路的。每一个调查团可以从任意一个景点出发,沿着计划好的游览线路依次调查,到达终点后再返回。每个景点只会有一个调查团经过,不会重复调查。举个例子:上图中一共派出了3个调查团:1. 蓝色:调查景点;22. 橙原创 2016-10-06 10:38:37 · 3900 阅读 · 0 评论 -
后缀数组四·重复旋律4
我们知道一个音乐旋律被表示为长度为 N 的数构成的数列。我们把一段旋律称为(k,l)-重复的,如果它满足由一个长度为l的字符串重复了k次组成。 如旋律abaabaabaaba是(4,3)重复的,因为它由aba重复4次组成。小Hi想知道一部作品中k最大的(k,l)-重复旋律。输入一行一个仅包含小写字母的字符串。字符串长度不超过 100000。输出一行一个整数,表示答案原创 2016-11-15 10:49:35 · 753 阅读 · 0 评论 -
数论一·Miller-Rabin质数测试
输入第1行:1个正整数t,表示数字的个数,10≤t≤50第2..t+1行:每行1个正整数,第i+1行表示正整数a[i],2≤a[i]≤10^18输出第1..t行:每行1个字符串,若a[i]为质数,第i行输出"Yes",否则输出"No"样例输入3379样例输出YesYesNo解法提示:有一种叫做Miller-Rabin质数测试原创 2016-11-15 11:00:01 · 531 阅读 · 0 评论 -
网络流一·Ford-Fulkerson算法
早在1955年,T.E.哈里斯就提出在一个给定的网络上寻求两点间最大运输量的问题。并且由此产生了一个新的图论模型:网络流。用数学的语言描述就是给定一个有向图G=(V,E),其中每一条边(u,v)均有一个非负数的容量值,记为c(u,v)≥0。同时在图中有两个特殊的顶点,源点S和汇点T。举个例子:其中节点1为源点S,节点6为汇点T。我们要求从源点S到汇点T的最大可行流量,这个问题也原创 2016-09-17 19:39:26 · 885 阅读 · 2 评论 -
简单并查集
描述给定一个包含 N 个顶点 M 条边的无向图 G ,判断 G 是不是一棵树。输入第一个是一个整数 T ,代表测试数据的组数。 (1 ≤ T ≤ 10)每组测试数据第一行包含两个整数 N 和 M 。(2 ≤ N ≤ 500, 1 ≤ M ≤ 100000)以下 M 行每行包含两个整数 a 和 b ,表示顶点 a 和顶点 b 之间有一条边。(1 ≤ a, b ≤ N)原创 2016-06-14 10:31:55 · 493 阅读 · 0 评论 -
搜索一·24点
描述判断输入四个数字能否计算出24,,需要考虑除0异常,浮点数操作。输入第1行:1个正整数, t,表示数据组数,2≤t≤100。第2..t+1行:4个正整数, a,b,c,d,1≤a,b,c,d≤10。输出第1..t行:每行一个字符串,第i行表示第i组能否计算出24点。若能够输出"Yes",否则输出"No"。样例输入25 5 5 19原创 2016-05-18 11:33:49 · 511 阅读 · 0 评论 -
同时查找最大值和最小值
#include #include #include #include using namespace std;void Find_MIN_MAX(int A[], int n){ int i, min, max; int len = 0; if( n % 2 ) { max = min = A[1]; len = n/2; for原创 2015-09-25 11:37:12 · 829 阅读 · 0 评论 -
网易互娱2017实习生招聘在线笔试(一)
过时间了没有提交,不知道正不正确,就是想纪念一下,还是太年轻了。。。#include #include #include #include #include using namespace std;unsigned char a[5];char b[5][10];char str[10][2]={"0","1","2","3","4","5","6","7","8","9"}原创 2016-03-22 16:16:02 · 2048 阅读 · 0 评论 -
昨晚的笔试题Skiing,动归+深搜
#include #include #include #include #include #define MAX(a,b) ((a)>(b)?(a):(b))using namespace std;int height[120][120] = { 0 };//保存输入高度值int length[120][120] = { 0 };//计算后的长度值int R, C;int df原创 2016-03-23 10:27:44 · 424 阅读 · 0 评论 -
KMP算法
KMP算法是一种改进的字符串匹配算法,关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。不是把"搜索位置"移回已经比较过的位置,而是继续把它向后移,这样就提高了效率。具体实现就是实现一个next数组。next数组每一位保存的是该位之前(包括该位)的字符串所有前缀和后缀最大公共长度值,当原串和匹配串在某一位出现不匹配时,使匹配串移动相应的位置数(即利用next数组前一位原创 2016-03-03 21:42:17 · 396 阅读 · 0 评论 -
最长回文子串
#include #include using namespace std;#define MIN(a,b) ((a)<(b)?(a):(b))const int MAX = 1000010;char str[MAX],newstr[2*MAX];int len,p[2*MAX];//p[]数组保存的是以每个字符为中心的最长回文子串的半径void change()//构造奇数字符原创 2016-03-10 14:25:45 · 353 阅读 · 0 评论 -
最长回文子串、回文子序列、公共子序列
/*一、最长回文子串(连续)1.manacher算法(见前面)2.动态规划*/bool p[100][100];for(int i=0;i<length;++i){ p[i][i]==true; if(i<length-1 && s[i]==s[i+1]) { p[i][i+1]=true; start=i; maxlength=2; }}for(int le原创 2016-04-10 18:08:04 · 468 阅读 · 0 评论 -
hdu4282 A very hard mathematic problem
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4282#include #include #include #define LL __int64using namespace std; LL pow1(LL x,int z){ LL temp = x; for(int i=2;i<=z;i++)转载 2012-09-19 16:59:29 · 412 阅读 · 0 评论 -
搜索二·骑士问题
描述国际象棋棋盘上有3个骑士,能否通过若干次移动走到一起。要选择一个位置汇合,使得3个骑士行动的总次数最少?输入第1行:1个正整数t,表示数据组数,2≤t≤10。第2..t+1行:用空格隔开的3个坐标, 每个坐标由2个字符AB组成,A为'A'~'H'的大写字母,B为'1'~'8'的数字,表示3个棋子的初始位置。输出第1..t行:每行1个数字,第i行表示第i组数据中3原创 2016-05-24 10:30:47 · 803 阅读 · 0 评论 -
map的操作
简单map应用 描述:给定一个数组和一个sum,返回数组中两个和等于sum的数的下标列表。#include #include #include #include #include #include #include #include using namespace std;int * findSumList(int* list, int length, int sum){原创 2016-05-13 10:33:44 · 442 阅读 · 0 评论 -
数论二·Eular质数筛法
如何去快速得求解[1,N]这个区间内素数的个数呢?自然我们已经知道了如何快速判定一个数是否是质数,那么我就直接将[1,N]之间每一个数判定一次,就可以得到结果。虽然我们已经通过快速素数检测将每一次判定的时间复杂度降低,但是N个数字的话,总的时间复杂度依旧很高。发现如果一个数p是质数的话,那么它的倍数一定都不是质数。所以我建立了一个布尔类型的数组isPrime,初始化都为true。我从2原创 2016-11-15 11:10:53 · 656 阅读 · 0 评论