本博客只是本人学习程序语言以及算法设计过程中的心得以及笔记,主要参考资料如下: ACM基本培训资料(属于内部资料); ACM、ICPC代码库(吉林大学); 算法导论(MIT神书); 2013年王道论坛计算机考研机试指南以及王道程序员求职宝典(王道论坛); 编程珠玑; 编程之美; 剑指offer; C++primer et.al.主要分成三个阶段: (1)模仿阶段:主要是学习别人的,所以说在第一阶段的博客里面有很多是重复别人的,甚至是直接copy的,在这里我已经做了说明,所以跟你写的代码一样,就担待一些吧~~ (2)理解阶段:对于一些比较难的算法,提出自己的一些见解,便于自己... Read More
posted @ 2013-12-01 11:25 yiyi_xuechen Views(171) Comments(0) Diggs(0) Edit
1 /** 2 哈希表的几个概念: 3 映像:由哈希函数得到的哈希表是一个映像。 4 冲突:如果两个关键字的哈希函数值相等,这种现象称为冲突。 5 6 处理冲突的几个方法: 7 1、开放地址法:用开放地址处理冲突就是当冲突发生时,形成一个地址序列,沿着这个序列逐个深测,直到找到一个“空”的开放地址,将发生冲突的关键字值存放到该地址中去。 8 例如:hash(i)=(hash(key)+d(i)) MOD m (i=1,2,3,......,k(k 16 using namespace std; 17 18 typedef int KeyType; //设关键字域为... Read More
posted @ 2013-12-01 11:14 yiyi_xuechen Views(311) Comments(0) Diggs(0) Edit
1 /** 2 题目描述: Ignatius 被魔王抓走了,有一天魔王出差去了,这可是 Ignatius 逃亡的好机会. 3 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩 阵,刚开始 4 Ignatius 被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现 在知道魔王将 5 在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个 坐标中的其中一个. 6 现在给你城堡的地图,请你计算出 Ignatius 能否在魔王回来前 离开城堡 7 (只要走到出口就算离开城堡,如果走到出口的时候魔王刚好回来也算逃 ... Read More
posted @ 2013-12-01 11:13 yiyi_xuechen Views(167) Comments(0) Diggs(0) Edit
1 /** 2 通过一个题目来认识深度优先搜索 3 题目描述: 4 一个N*M迷宫,入口S,出口D,能走的是.,不能走的是X,问从入口进入后能否在T时间内走出迷宫? 5 6 输入: 7 N,M,T分别代表迷宫的长度和宽度以及时间,注意三者输入都是0时,结束 8 9 输出: 10 能走出为YES;不能走出为NO 11 12 样例输入: 13 4 4 5 14 S.X. 15 ..X. 16 ..XD 17 .... 18 3 4 5 19 S.X. 20 ..X. 21 ...D 22 0 0 0 23 24 样例输出: 25 NO 26 YES 27 代码用... Read More
posted @ 2013-12-01 11:12 yiyi_xuechen Views(224) Comments(0) Diggs(0) Edit
1 /** 2 对多边形A1A2A3...An(顺或逆时针都可以,逆时针的话就不用加绝对值了~),设平面上有任意的一点P(0,0),则有: 3 S(A1,A2,A3,... ,An) = abs(S(P,A1,A2) + S(P,A2,A3)+...+S(P,An,A1)) 4 也就是说,假设Ai坐标为(xi,yi),则 5 S(A1,A2,A3,... ,An) =abs(1/2 *(x1y2 - x2y1 + x2y3 - x3y2 + ... + xn-1yn - xnyn-1)) 6 7 输入: 8 n——测试多边形的个数 9 m——当前多边形的点的个数10 x1, y1, x2,.. Read More
posted @ 2013-12-01 11:10 yiyi_xuechen Views(163) Comments(0) Diggs(0) Edit
1 /** 2 给出线段AB以及线段CD,只要判断A、B两点在直线CD的两端,并且C、D两点在直线AB的两端即可。 3 用叉乘进行判断。 4 5 问题描述 6 下面给出的是一个判断线段相交的次数 7 8 输入: 9 n:线段的个数 10 seg.begin.x,seg.begin.y,seg.end.x,seg.end.y:分别表示线段p1p2的点坐标 11 12 输出: 13 n个线段中两两相交的次数 14 15 样例输入 16 2 17 1 0 0 0 18 0 1 0 0 19 样例输出: 20 1 21 */ 22 23 #include 24 using... Read More
posted @ 2013-12-01 11:09 yiyi_xuechen Views(305) Comments(0) Diggs(0) Edit
最大公约数 1 /** 2 最大公约数(GCD,greatest common divisor),欧几里得算法啦~~ 3 */ 4 5 #include 6 using namespace std; 7 8 //递归形式 9 /*int gcd(int a, int b)10 {11 if(b == 0)12 return a;13 else14 return gcd(b, a % b);15 }*/16 17 //非递归形式18 int gcd(int a, int b)19 {20 while(b != 0)21 {22 ... Read More
posted @ 2013-12-01 11:05 yiyi_xuechen Views(246) Comments(0) Diggs(0) Edit
1 /** 2 定义 3 ⒈ 对于一个集合D,D中任意有限个点的线性组合的全体称为D的凸包。 4 ⒉ 对于一个集合D,所有包含D的凸集之交称为D的凸包。 5 可以证明,上述两种定义是等价的 6 7 概念 8 1. 点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点 9 或者在多边形边上或者在其内。 10 2. 一组平面上的点,求一个包含所有点的最小的凸多边形,这就是凸包 11 问题了。这可以形象地想成这样:在地上放置一些不可移动的木桩,用 12 一根绳子把他们尽量紧地圈起来,并且为凸边形,这就是凸包了。 13 14 常用方法: 15 穷举法,格雷... Read More
posted @ 2013-12-01 11:04 yiyi_xuechen Views(883) Comments(0) Diggs(0) Edit
1 /** 2 给出线段AB以及线段CD,只要判断A、B两点在直线CD的两端,并且C、D两点在直线AB的两端即可。 3 用叉乘进行判断。 4 5 问题描述 6 下面给出的是一个判断线段相交的次数 7 8 输入: 9 n:线段的个数 10 seg.begin.x,seg.begin.y,seg.end.x,seg.end.y:分别表示线段p1p2的点坐标 11 12 输出: 13 n个线段中两两相交的次数 14 15 样例输入 16 2 17 1 0 0 0 18 0 1 0 0 19 样例输出: 20 1 21 */ 22 23 #include 24 using... Read More
posted @ 2013-12-01 11:03 yiyi_xuechen Views(303) Comments(0) Diggs(0) Edit
1 /** 2 题目描述: 3 输入N个学生的信息,然后进行查询。 4 5 输入: 6 输入的第一行为N,即学生的个数(N 40 #include 41 #include 42 #include 43 using namespace std; 44 45 struct Student 46 { 47 char no[100]; 48 char name[100]; 49 char sex[5]; 50 int age; 51 52 bool operator = base) 79 { 80 ... Read More
posted @ 2013-12-01 11:01 yiyi_xuechen Views(227) Comments(0) Diggs(0) Edit
C++的Algorithm函数库中存在一系列的查找函数,使用起来很方便: 1 #include 2 #include 3 #include 4 using namespace std; 5 6 int main() 7 { 8 int all[14]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6}; 9 int *a = find(all, all + 11, 8);//在all的前11个元素中查找8,如果存在,则返回8所对应的指针10 printf_s("%d\n", *a);11 12 int all2[4] = {... Read More
posted @ 2013-12-01 10:59 yiyi_xuechen Views(179) Comments(0) Diggs(0) Edit
要注意两种不同的初始化方法以及算法复杂度问题。 1 /** 2 高精度整数的四则运算—— + - * / % 3 以进制转换为例,输出X的N进制表示的数 4 5 题目描述 : 6 将M进制的数X转换为N进制的数输出。 7 8 输入: 9 输入的第一行包括两个整数:M和N(2 21 #include 22 #include 23 using namespace std; 24 25 #define maxDigits 100 26 27 ////高精度整数类 28 class bigInteger 29 { 30 pub... Read More
posted @ 2013-12-01 10:58 yiyi_xuechen Views(380) Comments(0) Diggs(0) Edit
1 /** 2 并查集定义: 3 并查集是一种树形数据结构,用于实现如确定某个集合含有哪些元素、判断 4 某两个元素是否存在于同一个集合中、求集合中元素的数量等问题。 5 并查集主要操作: 6 (1)合并两个不相交的集合; 7 (2)判断两个元素是否属于同一集合。 8 9 题目描述: 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直10 接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(11 但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设12 多少条道路? 13 输入:14 测试输入包含若干测试用例。每个测试用例的第... Read More
posted @ 2013-12-01 10:57 yiyi_xuechen Views(182) Comments(0) Diggs(0) Edit
本文主要介绍了最小生成树的两种解决办法:kruskal以及prim 1 /** 2 Kruskal算法流程: 3 (1)初始时所有节点属于孤立的集合; 4 (2)按照边权递增顺序遍历所有的边,若遍历到的边两个节点仍分属于不同的 5 集合(该边即为联通这两个结合的边中权值最小的那条),则确定该边为最小生 6 成树上的一条边,并将这两个顶点分属的集合合并; 7 (3)遍历完所有的边之后,原图上所有节点属于同一个集合则被选取的边和原图 8 中所有节点构成最小生成树;否则原图不连通,最小生成树不存在。 9 10 11 样例输入: ... Read More
posted @ 2013-12-01 10:56 yiyi_xuechen Views(218) Comments(0) Diggs(0) Edit
本文主要讨论了最短路径的三个算法:Floyd,Dijkstra以及Bellman_Ford的实现方法以及他们之间的区别与联系 1 /** 2 Floyd算法流程: 3 若edge[i][j]表示从结点i到结点j,中间只能经过编号小于k的点时的最短路径长度, 4 我们可以由这些值确定当中间允许经过编号小于等于k的结点时,它们之间的最短路径长 5 度。同样,与原情况相比,新情况中允许 出现在中间路径的结点新增了编号为 k 的结 6 点,同理我们确定 edge[i][k] + edge[k][j]的值与edge[i][j]的值,若前者较小则该值代 7 表了新情况中从结点i到... Read More
posted @ 2013-12-01 10:52 yiyi_xuechen Views(253) Comments(0) Diggs(0) Edit
18. 移除特定元素——remove 1 #include 2 #include 3 #include 4 5 //remove 6 #include 7 #include 8 using namespace std; 9 10 int main()11 {12 int all[11] = {11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};13 int *a = remove(all, all + 11, 2);// 移除all中所有数值为2的元素14 15 for(int i = 0 ; i 2 #include 3 #include 4 5 //swap 6 #... Read More
posted @ 2013-12-01 10:51 yiyi_xuechen Views(170) Comments(0) Diggs(0) Edit
9. 包括——includes 1 #include 2 #include 3 #include 4 5 //includes 6 #include 7 #include 8 9 using namespace std;10 11 int main()12 {13 int all[11] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};14 int all2[4] = {4, 5, 8};15 16 bool y = includes(all, all + 10, all2 , all2 + 3);//判断all的前10个数中是否包含all2的三个... Read More
posted @ 2013-12-01 10:47 yiyi_xuechen Views(270) Comments(0) Diggs(0) Edit
题目描述: 嘿嘿,这个关于 7 的题目这次算是第三次了。这个 7 可谓是最厉害的,呵呵。 首先,如果这个数要在 1 - 1 000 000之间, 并且能够被 7 整除或者用 10 进制表示的时候包含数字 7, 那么这个数就叫做魔女の数。输入: 有多个测试点,每个测试点一行,只有两个整数 a 和 b, 你需要计数出 a 和 b 之间(包含 a 和 b)一共有多少个 魔女の数。不过如果 a 与 b 其中有一个不在魔女の数 的范围内的话,应该输出 Overflow。输出: 对每个测试点输出对应的魔女の数的数目, 一个结果一行,按样例格式输出。样例输入:1 107 170 9样例输出:有 1 ... Read More
posted @ 2013-12-01 10:42 yiyi_xuechen Views(275) Comments(0) Diggs(0) Edit
1.求和——accumulate 1 #include 2 #include 3 #include 4 5 #include//accumulate 6 using namespace std; 7 8 int main() 9 {10 int all[100] = {2,2,3,4,5,6,7,8,9,10};11 int sum = accumulate(all, all + 3, 1);//all的前三个数相加,和的初始值是112 printf("%d", sum);13 14 return 0;15 }2.二分查找—— binary_search 1... Read More
posted @ 2013-12-01 10:39 yiyi_xuechen Views(428) Comments(0) Diggs(0) Edit
算法是计算机科学领域最重要的基石之一,但却受到了国内一些程序员的冷落。许多学生看到一些公司在招聘时要求的编程语言五花八门就产生了一种误解,认为学计算机就是学各种编程语言,或者认为,学习最新的语言、技术、标准就是最好的铺路方法。其实大家都被这些公司误导了。编程语言虽然该学,但是学习计算机算法和理论更重要,因为计算机算法和理论更重要,因为计算机语言和开发平台日新月异,但万变不离其宗的是那些算法和理论,例如数据结构、算法、编译原理、计算机体系结构、关系型数据库原理等等。在“开复学生网”上,有位同学生动地把这些基础课程比拟为“内功”,把新的语言、技术、标准比拟为“外功”。整天赶时髦的人最后只懂得招.. Read More
posted @ 2013-12-01 10:33 yiyi_xuechen Views(191) Comments(0) Diggs(0) Edit