
Algorithm
文章平均质量分 74
jcwKyl
吾尝终日而思矣,不如须臾之所学也。
展开
-
JOJ 1133 Domino Effect
题目链接:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1133 可以这样简单理解这个题目:一个连通图,把标号为1的顶点点燃,所有边的燃烧速度相同,问整个图全部烧完需要多长时间。例如,下图: 对于左图,从它的一个顶点开始点燃,每条边上的数字表示这条边从一个原创 2009-07-12 15:08:00 · 1274 阅读 · 1 评论 -
10个经典的字符串hash函数的C代码实现
所有内容均来自于:http://www.partow.net/programming/hashfunctions/以下总共给出了10种字符串hash函数,在上面的链接中可以找到各个Hash函数的描述,以及一些其它的关于hash函数的资料下载。这些hash函数各自的优缺点不详。其中,ELFHash函数是在unix系统中被广泛使用的,也是《算法艺术与信息学竞赛》中作者推荐的一个字符串ha原创 2009-04-17 22:02:00 · 13955 阅读 · 3 评论 -
JOJ 1106 Complicated Expressions
题目要求就是去除四则运算表达式中的冗余括号。这在做《编程之美》中的24点练习时就已经遇到过。方法很简单:先把中缀表达式转换成后缀表达式,这一步可以去掉所有的括号,然后把后缀表达式还原为中缀表达式,在还原的过程中加上必要的括号。有两种情况必须为子表达式加括号:一,子表达式的运算优先级低于根的运算优先级时,必须将子表达式用括号保护起来;二,如果根的运算符是减号或者除号,因为它们不满足交换律,这种原创 2009-04-13 21:36:00 · 1686 阅读 · 0 评论 -
数学是一种思考方式
本方来自:http://www.kuqin.com/math/20071126/2658.html数学是一种思考方式作者:不详 来源:互联网 酷勤网收集 2007-11-26 摘要酷勤网 数学的发展历史中,又包含了许多人无穷的创造力。光靠逻辑推理来一步步解决问题显然是不够的。很多数学问题的解决,都起源于某种直觉,某种创造性构建,甚至把许多表面不相关的东西牵连在一起思考。然转载 2009-03-12 13:01:00 · 1490 阅读 · 1 评论 -
JOJ 2200 Fracions
其他博客里的零散的几篇。统一放在这里吧。题目:A fracion a/b(a Input and OutputFor each case there are tow positive intergers a and b( 0 Sample Input2 33 44 15Sample Output6616Hint: 2/3 = 1/原创 2009-03-11 07:28:00 · 1100 阅读 · 0 评论 -
算法学习笔记之:找出所缺的整数
题目:数组A中包含n-1个[0,n-1]内的不同整数,n个数中只有一个数不在所给的数组中。设计一个找到这个数的O(n)时间的算法。除了数组A自身以外,只能利用O(1)的额外空间。与之相似的另一个题目见《算法导论》思考题4-2:问题同上,但在这里,不能由一个单一操作来访问A中的一个完整整数,因为A中整数是以二进制表示的。我们所能用的唯一操作就是“取A[i]的第j位”,这个操作所花时间为常数。题目原创 2009-03-04 22:29:00 · 3143 阅读 · 3 评论 -
Diffie-Hellman密钥交换算法的原理及程序演示
在http://en.wikipedia.org/wiki/Diffie-Hellman上面给出了这个密钥交换协议的历史,原理,重要文献的链接,以及演示代码。它的数学基础就是离散对数这个数学难题。用它进行密钥交换的过程简述如下: 选取两个大数p和g并公开,其中p是一个素数,g是p的一个模p本原单位根(primitive root module p),所谓本原单位根就是指在模p乘法运算下,g的1次方原创 2008-12-19 00:15:00 · 14681 阅读 · 2 评论 -
base64编码与解码
今天考试,给出了base64编码的规则,需要编写一个程序实现base64解码(对于字符串中有中文或者其它多字节字符的,要注意他们的编码,比如对于中文字符,使用的是UTF8而不是GB2312,这一点在最后面有说明)。 base64编码规则概述: 在密码学领域里,非常多的加密想法极有创意,base64便是其中一种。虽然规则简单,但值得仔细品味欣赏。关于base64编码的细节和应用,网上能搜索到很多资料原创 2008-12-19 11:07:00 · 4511 阅读 · 0 评论 -
《编程之美》学习笔记之——算法设计中的逆向思维
两个例子:例一:找符合条件的整数题目概述:给定正整数N,求最小的正整数M,使N*M十进制表示中只有0和1.著者给出多种解法。解法一在正整数范围内穷举M。解法二改进了解法一,在十进制表示中只有0和1的正整数范围内穷举N*M,从而间接找到M。解法三再次改进解法二,在模N同余的意义下按照模N的余数对可能的N*M进行分类,这样,便把搜索空间从指数复杂度降到了线性复杂度。例二:数组分割问题题目概述:有一个没原创 2009-02-23 10:54:00 · 3145 阅读 · 3 评论 -
《编程之美》笔记之——24点游戏
原著中给出了两种解法:穷举和分治。后来加上去除冗余括号等操作,自己写了四个实现代码,但完全还是用的原著中的算法思想。暂且把自己的实现过程记录下来。自己的第一种代码实现,完全穷举,没有任何的优化。代码写得极其笨拙。程序穷举了四个数字能组成的所有可能的算式,分别计算它们的值,找到结果是24的那个算式,输出它。一个不带括号的算式总是有形式a op1 b op2 c op3 d,其中a,b,c,d是运原创 2009-02-24 11:50:00 · 7273 阅读 · 3 评论 -
JOJ 1903 1129 1157 1278
JOJ 1903 Tug of War: http://acm.jlu.edu.cn/joj/showproblem.php?pid=1903 题目概述:给N个正整数,每个正整数在1到450之间,N最大是100,要求把N个正整数分成两组,两个分组包含的正整数的数目之差不能超过1,并且使得两个分组所含的正整数的和最接近。比如三个正整数100,90,200,显然分成{100,90}和{200原创 2009-04-24 15:05:00 · 1544 阅读 · 0 评论 -
连续邮资问题
王晓东老师编著的《计算机算法设计与分析》5.12节以“连续邮资问题”为例展示了回溯法的应用。讲解比较简略,对于搜索出一张新的邮票面值后如何更新最大连续邮资区间这一点没有过多的说明。以下是自己对于这一节学习的一点笔记。实际上,关于刚才所说的更新最大连续邮资区间的方法,可以归结到一种“等价类”的思想。与此相似的还有《编程之美》中“数组分割问题”的解法三,《编程之美》中“找符合条件的整数”原创 2009-04-29 17:55:00 · 14080 阅读 · 7 评论 -
JOJ 1124 Parliament 最大乘积的整数分拆
题目链接:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1124&off=1100 原题: New convocation of The Fool Lands Parliamentconsists of N delegates. According to the present regulation d原创 2009-07-10 16:05:00 · 2272 阅读 · 2 评论 -
关于二分图
这里是把自己会的和已经理解的关于二分图的东西小结一下。内容包括: 二分图的定义概述; 什么样的无向图是二分图(二分图一条重要性质的证明); 二分图匹配(增广路算法、M交错路径算法); 二分图模型的理解,JOJ 1102 Courses,JOJ 1122 The Dog Task两原创 2009-07-09 23:38:00 · 4400 阅读 · 0 评论 -
JOJ 1119 1121
JOJ 1119: Number Game题目:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1119题目大意:两个人轮流取数,取数规则如下:已经取过的数不能取;已经取过的数的倍数不能取;不能取的数字的和也不能取。如果轮到某个人取数时,已经无数可取,则输掉游戏。现在给出当前可取的数字的列表,问应该取哪个数才能胜利,如果这样的数不止一个,把它原创 2009-06-09 00:08:00 · 964 阅读 · 0 评论 -
JOJ 1115 1116 1117 1118
1115:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1115非常简单,直接按照题目说的来做就可以。1116:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1116一开始读题不仔细,以为只有两台电脑,这样的话就是一个简单的模线性方程。后来发现电脑数不超过20,觉得应该是中国剩余定理,结果这原创 2009-06-06 13:10:00 · 938 阅读 · 0 评论 -
JOJ 1114 The Maze 种子填充算法
<!--v/:* {behavior:url(#default#VML);}o/:* {behavior:url(#default#VML);}w/:* {behavior:url(#default#VML);}.shape {behavior:url(#default#VML);}--> Normal 0 7.8 磅 0 2原创 2009-06-04 09:48:00 · 2526 阅读 · 0 评论 -
JOJ 1109 I-KeyBoar 动态规划
题目:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1109大意就是有L个使用频率各不相同的字符,把它们按顺序分配到K个按键上,使总代价最小,代价定义为一个字母的使用频率乘以它被分配到某个按键上的位置(一个字母的位置要么是1,表示它被安排成为某个键的首字母,或者是它前面的字母的位置加1,表示它与它前面的字母分配到同一个按键上)。这个题目最直接的原创 2009-06-07 09:33:00 · 1107 阅读 · 0 评论 -
分酒问题与JOJ 1200 Jugs
JOJ 1200 Jugs题目链接:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1200题目的意思是,有两个容器,容量分别为ca和cb,ca cb,初始时两个容器都是空的,水无限量供应,问如何用这两个容器量出n单位的水放在容量为cb的那个容器中?这个题目给出的数原创 2009-08-03 14:52:00 · 2110 阅读 · 0 评论 -
multiplication puzzle
这是emacs中的一个小游戏:给一个用大写字母表示的乘法算式,计算出每个大写字母代表的数字。例如,以下的乘法竖式: Normal 0 7.8 磅 0 2 MicrosoftInternetExplorer4原创 2009-05-17 12:21:00 · 2017 阅读 · 0 评论 -
JOJ 2171 2488 1868 2237
这几天专门挑些简单的算法题目做做,怕忘记,贴在这里。JOJ 2171 An Easy Problem: http://acm.jlu.edu.cn/joj/showproblem.php?pid=2171给定一个正整数N,N不超过40,问在N位由数字0、1组成的所有串中,没有连续3个1出现的串的个数是多少。比如N为1的时候,有0、1两个,N为2的时候,有00、01、10、11四个,N原创 2009-05-05 22:35:00 · 1844 阅读 · 0 评论 -
《编程之美》之寻找发帖水王与JOJ 1069
两个题目解题思想非常相似。就是把一个问题转化为规模较小的问题,在转化的过程中小问题与原问题本质上一致。这样,可以通过把小问题转化为更小的问题。寻找发帖水王题目是找出一堆数据中出现次数超过总数一半的那个数据。《编程之美》上的分析是:如果每次删除两个不同的数据,那么剩下的数据列表中,我们要找的那个数据的出现次数仍然超过总数的一半。于是,可以在O(N)的时间复杂度内和O(1)的空间复杂度解决这个问题。J原创 2009-02-14 09:20:00 · 1985 阅读 · 0 评论 -
《编程之美》“让CPU占用率听你指挥”学习笔记
CPU占用率可理解为忙的时间与总的时间的比。若此,自然有第一种解法:空循环与Sleep。具体的方法和代码在《编程之美》的原著中有详述。须注意的是,测出CPU一秒钟能执行的空循环次数(假设能执行C次空循环)后,不能简单地空循环C/2次,然后休息半秒钟。这样得出的曲线虽然大致上是所要求的开头,但是抖动非常厉害。解决方法是什么呢?解决方法就是使用更小的时间片。如果原来一秒钟可以做C次空循环,那么可以原创 2009-02-16 20:22:00 · 3017 阅读 · 6 评论 -
《编程之美》之:"程序理解和时间分析"与JOJ 2042
这是《编程之美》的2.20题目,给出一段C#代码,要求不用电脑,理解程序并回答问题。下面是从C#代码中改写成的C++代码:#include #include using namespace std;int main() { int rg[] = {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19, 20原创 2009-02-14 13:11:00 · 6584 阅读 · 2 评论 -
joj 1066: Fire Net II
题目:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1066套用JOJ 1017的代码就可以AC,不过运行时间比较长。只需要在JOJ 1017的代码中在ok函数里判断一下是否有处于一条斜线上的,再把数组规模改大一就可以。代码参见1017 Fire Net的代码。原创 2008-10-26 11:14:00 · 957 阅读 · 0 评论 -
JOJ 1058 T9
题目:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1058 算法:Trie树,广度优先搜索思路:把字典建成一个Trie树,每次处理一个按键序列时,都建立一个队列,循环处理,初始循环时,Trie的根结点入队,每次循环时,遍历当前在队列中的每一个结点的所有子结点,把它们的子结点当中与当前所处理的按键相同的结点入队,全部入队完毕后,选中当前队列原创 2008-10-10 15:29:00 · 1081 阅读 · 0 评论 -
JOJ 1026 The staircases
题目描述:有N块砖头,摆成阶梯状,要求阶梯高度必须严格递增。给定N,求所有不同的摆法总数。原题目见:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1026方法一:N块砖头至少摆出两阶,因此第一阶的砖头数目最大为floor((n-1)/2)。设f(i,j)表示i块砖头摆成的阶梯中第一阶摆了j块砖头的所有摆法总数。那么,给定砖头总数N,所要求的原创 2008-10-05 09:49:00 · 2151 阅读 · 5 评论 -
使用重定向方便程序测试
在online judge上做题的时候,通常程序要读入大批输入数据进行测试。每次运行都从键盘上敲入测试数据很麻烦。为了省却键盘输入的麻烦,往往使用freopen进行输入输出重定向。但需要在测试完成后注释掉它们。我们可以用操作系统自带的重定向来完成,例如,编译后的程序为test.exe,测试数据放在in.txt中。我们可以这样进行输入重定向:test 表示从in.txt中读取输入数据。还可以同时原创 2008-10-04 15:30:00 · 1684 阅读 · 1 评论 -
JOJ 1003 Channel Allocation
题目:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1003图的着色问题。因为已知任何平面图都可以用不多于四种的颜色进行着色,并且使相邻顶点的颜色不同。所以分别使用1,2,3,4四种颜色进行试探。使用回溯法,代码如下:#include #include int repeaters,net[26][26],l,c,i,j,原创 2008-10-08 11:05:00 · 7445 阅读 · 0 评论 -
JOJ 1002 Stockbroker Grapevine
题目:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1002每个人是有向图中的一个点,信息的传递是一条有向边。传递所需的时间为边的权。题目的要求实际就是在该图中能否找到一点,使该点到其余点都有路径可达。题目所要的答案就是这个点到其它点的最短路径中最长的那条路径的长度。所以,解法就是使用floyed算法求出图中每个点到其余点的最短路径,在那些到其原创 2008-10-08 10:45:00 · 1235 阅读 · 0 评论 -
统计数字问题
在王晓东编著的《算法设计与实验题解》中看到的这个问题,问题描述如下:一本书的页码从自然数1开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如第6页用6表示而不是06或006。数字统计问题要求对给定书的总页码,计算出书的全部页码中分别用到多少次数字0,1,2,3,.....9。这个题目有个最容易想到的n*log10(n)的算法。这是自己写的复杂度为O(n*lo原创 2008-10-02 12:54:00 · 14941 阅读 · 8 评论 -
关于字符串比较的一点讨论---strcmp与memcmp的效率及实现原理
要求写一个比较高效的文件比较程序,竟然发现memcmp比strcmp要快很多,于是跟踪调试,发现它们的实现原理:intel/strcmp.asm: mov edx, dword ptr [esp + 4] ;取第二个参数地址 mov ecx, dword ptr [esp + 8] ;取第一个参数地址 test edx, 3 ;edx是第二个参数的地址,这里即检验该地址是否是4原创 2008-03-25 18:41:00 · 16617 阅读 · 3 评论 -
JOJ 1017 FireNet
题目:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1017非常简单的回溯,没有用任何的限界函数就可以AC。代码如下: #include int n;char m[5][5];int ans, cn;bool ok(int i, int j) { if(m[i][j] == X) r原创 2008-10-26 10:52:00 · 1239 阅读 · 0 评论 -
JOJ 2039: Fire Net III
题目:http://acm.jlu.edu.cn/joj/showproblem.php?pid=2039算法:动态规划 分析如下:设函数f(n,k)表示大小为n的地图中放k个blockhouse的方法数。那么,放置blockhouse的方法无外乎以下两种:1. 一个blockhouse放在了第一行第一个位置。2. 没有任何blockhouse放在第一行第一个位置。原创 2008-10-26 17:52:00 · 941 阅读 · 0 评论 -
JOJ 1042: Ambiguous Dates
这个题目的复杂性主要表现在细节太多了。其实不需要使用什么大的或者是复杂的算法。主要还是程序逻辑是否清晰。代码先贴出来。以后再写流程。#include #include #include char *token1,*token2,*token3,date[12];char sep[]="///-.,";int n,sc=0,ambi_date[2048],n原创 2008-10-11 21:55:00 · 986 阅读 · 0 评论 -
约瑟夫环的数学解法
原文出处:http://blog.youkuaiyun.com/MapReduce/archive/2007/04/02/1549494.aspx作者:MapReduce全文:约瑟夫环问题是一道经典的数据结构题目问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。一般我们采用一个循环队列来模拟约瑟夫环的求解过程,但是如果n比较大的时候,采用模拟转载 2009-02-13 08:36:00 · 3500 阅读 · 1 评论 -
数组循环移位问题
《编程之美》中的题目要求只使用两个附加变量。王晓东编著的《算法设计与实验题解》中要求只用到O(1)的辅助空间。其它地方两本书的要求相同,都是O(n)的时间复杂度。两本书中的解法总结起来就是三种方法:(1)循环换位算法(2)三次反转算法(3)排列循环算法。这三种算法在王晓东的著作中都有实现代码。第一种算法是最原始的算法。第二种算法比较巧妙,即使用VU=reverse(reverse(U)reserv原创 2009-02-10 16:41:00 · 7201 阅读 · 5 评论 -
排列的生成
排列和组合的生成在组合数学书中都有,这里是做一个小总结。下面是两种实现方法:#include #include #include using namespace std;#define MAX_N 32int A[MAX_N], used[MAX_N], n, total;void backtrack(int i) { if(i > n) {原创 2009-02-06 22:38:00 · 1802 阅读 · 0 评论 -
一种写程序快速计算常系数线性齐次递推关系的指定项的方法
上次学习到了利用Fibonacci恒等式在log(n)时间内计算出F(n)的方法。这种方法也适用于任何常系数线性齐次递推数列的计算。在这里把能想到的东西小结一下。例一:扩展Euclid算法。两个整数a,b的最高公因数为gcd(a,b)。扩展Euclid算法在计算出gcd(a,b)的同时计算出gcd(a,b)=sa+tb中的系数s,t。因为:这样,只要计算出中间那些矩阵的乘积,就很容易计算出系数s,原创 2009-02-03 14:58:00 · 2333 阅读 · 0 评论 -
编程之美——找符合条件的整数
题目:任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0.解决这个问题首先考虑对于任意的N,是否这样的M一定存在。可以证明,M是一定存在的,而且不唯一。简单证明:因为 这是一个无穷数列,但是数列中的每一项取值范围都在[0, N-1]之间。所以这个无穷数列中间必定存在循环节。即假设有s,t均是正整数,且s,所以例如,取N=3,因为10的任何原创 2009-02-02 22:12:00 · 8752 阅读 · 7 评论