算法
BlueMood1986
一个小程序员
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
中国剩余定理
中国剩余定理是用来解决同余方程组的问题。如 pku1006:Biorhythms 题设m1,m2....mk两两互质, x=a1(mod m1); x=a2(mod m2); . . x=ak(mod mk);该方程组在0该问题的求解用到了求最大公约数的算法。求最大公约数的欧几里德算法:int gcd(int a,int b)//a>=b{ if(b==0)return a; else r原创 2008-07-25 21:42:00 · 689 阅读 · 0 评论 -
八数码问题
问题简介:所谓八数码问题是指这样一种游戏:将分别标有数字1,2,3,…,8的八块正方形数码牌任意地放在一块3×3的数码盘上。放牌时要求不能重叠。于是,在3×3的数码盘上出现了一个空格。现在要求按照每次只能将与空格相邻的数码牌与空格交换的原则,将任意摆放的数码盘逐步摆成某种特殊的排列。如下图表示了一个具体的八数码问题求解。问题分析:首先,八数码问题包括一个初始状态(START转载 2011-11-16 12:11:20 · 1829 阅读 · 0 评论 -
排序算法
选择排序插入排序交换排序排序算法最好时间复杂度最差时间复杂度平均时间复杂度空间复杂度稳定性直接插入排序O(n)O(n2)O(n2)O(1)稳定冒泡排序O(n)O(n2)O(n2)O(1)稳定选择排序O(n2)O(n2)O(n2)O(1)不稳定原创 2008-08-07 13:34:00 · 483 阅读 · 0 评论 -
求二分图最大匹配
一直寻找二分图中是否存在着交错链,如果存在,则使匹配的数目增1.交错链开始于左部,也结束于左部。路径长度为奇数,第1条和最后一条线段都不属于匹配。这样,如果存在交错链则肯定存在另一个匹配比原先的匹配长度多1.flag代表是否当前点已经被访问过,link代表构成交错链以后点的前驱bool source[110][310],flag[310];int _link[310],p,n;bool find(原创 2008-08-07 15:19:00 · 666 阅读 · 0 评论 -
线性时间排序
计数排序假设n个输入元素中的每一个都是介于0到k之间的证书,此外k为某个证书。当k=o(n)时,计数排序的运行时间是O(n);计数排序的基本思想是对每一个输入元素x,确定出小于x的元素个数,有了这一信息,就可以把x直接放到它在最终输出数组的位置上。int k;//所有数都介于0到k之间int a[n],b[n];//a为未排序的数组,b为排序好的数组void count-sort()------原创 2008-08-07 13:57:00 · 530 阅读 · 0 评论 -
查找
二分查找:数组必须是有序的数组。int low,hiagh;int k;while(low{ int mid=(low+high)/2; if(k==a[mid])return true; else if(k else low=mid+1;} 寻找数组中第i小的元素利用快速排序的思想。int select(int low,int high,int i) //i代原创 2008-08-07 14:13:00 · 580 阅读 · 0 评论 -
求最大公约数算法
欧几里德算法:int gcd(int a,int b)//a>b{ if(b==0)return a; else return gcd(b,a%b);}stein算法:欧几里德算法是计算两个数最大公约数的传统算法,他无论从理论还是从效率上都是很好的。但是他有一个致命的缺陷,这个缺陷只有在大素数时才会显现出来。考虑现在的硬件平台,一般整数最多也就是64位,对于这样的整数,计算两个数之间的模是原创 2008-08-07 11:29:00 · 636 阅读 · 0 评论 -
字符串匹配算法
朴素的字符串匹配算法需要n*m的时间复杂度。KMP算法能够很好的解决字符串匹配问题。 int fail[n];//////失败函数void compute-fail()//s2为子字符串{ fail[0]=-1; k=-1; for(i=1;i { while(k>-1&&s2[i]!=s2[k+1])k=fail[k]; if(s2[k+1]=原创 2008-08-07 14:44:00 · 642 阅读 · 0 评论 -
七种qsort排序方法
一、对int类型数组排序 int num[100]; Sample: int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; } qsort(num,100,sizeof(num[0]),cmp); 二、对char类型数组排序(同int类型) char word[100]; Sample: int cmp转载 2008-07-25 22:39:00 · 521 阅读 · 0 评论 -
pku1015 Jury Compromise解题报告
该题可以转化为从一个数列中抽取一定数量的数,使其和的绝对值最小。 如:-1,-2,-3,-4,-5,-6,-7,-8,0,1,2,3,4,5,6,7,8,9; -400从中抽取5个数,使其绝对值最小;bool judge[21][810];//表示从数列中抽取i个数可能达到的和值。int a[i]为数列;第一个数时,judge[1][a[1]]=1;第二个数时,if(judge[1]原创 2008-07-28 15:30:00 · 817 阅读 · 0 评论 -
找零钱问题
如题,给出6种珠宝,每种珠宝的价值为1,2,3,4,5,6;每种珠宝的数量为m1,m2,m3,m4,m5,m6;求解:是否这一堆珠宝集合可以被平分为价值相同的两堆?问题可以被转化为,num为这堆珠宝总价值的一半,问是否有一定数量珠宝的价值恰好等于num?这样问题就转化为找零钱问题,用动态规划可解;算法:bool judge[60001];judge[i]用来判断价值i是否能够用来表示;for(i=转载 2008-07-28 15:08:00 · 686 阅读 · 0 评论 -
连续的子序列最大值
给出一个数字序列,如-1,1,2,-3,4,6,-5,8,-3,9;求连续的子序列最大值。该题中,最大的子序列为4+6+(-5)+8+(-3)+9=19 算法:test[]={-1,1,2,-3,4,6,-5,8,-3,9}m=0;for(k=0;kn;k++){ m+=test[k]; if(m0)m=0; if(max1m)max1=m;}pku 10原创 2008-07-28 14:50:00 · 1071 阅读 · 0 评论 -
pku1009,Edge Detection解题报告
如题,求转化过后的数字序列;解题思路:如果只有一行,则从输入序列中分别判断。对于每个相同的数字序列,如15 4,4个连续的15,分别计算第一个和最后一个15的值,中间的都以0填充。如果有多行,每一行的值都由它的上一行,和下一行共同判断计算。定义变量数组image[3][3000][2],用来存储从输入序列中读入的三行,然后根据这三行计算中间一行的值。优化:如果有多行都是相同的值,则中间所有行的值都原创 2008-07-25 22:49:00 · 832 阅读 · 0 评论 -
编程时圆周率的精确取值
圆周率用p表示#includecos(180~)=-1;p=acos((double)-1); 这样就可以求出圆周率的精确值。原创 2008-07-25 21:37:00 · 1065 阅读 · 0 评论 -
大数的加减乘除
当数的位数非常大而常规的数据类型不足以存储的时候,可以考虑使用大数。即用一个长的数组来存储相应的位数,如inta[100],a的每一位存储一位数字或几位数字,根据常规的加减乘除运算对数组进行操作。使用string类型对数组进行操作,虽然比用整型简便,但可能增加了运行时间。pku1001:Exponentiation 就用到了大数的乘法如下是一个使用string类型进行大数加减乘除的例子:#原创 2008-07-25 20:51:00 · 2906 阅读 · 0 评论 -
pku题目分类
主流算法: 1.搜索 //回溯 2.DP(动态规划) 3.贪心 4.图论 //Dijkstra、最小生成树、网络流 5.数论 //解模线性方程 6.计算几何 //凸壳、同等安置矩形的并的面积与周长 7.组合数学 //Polya定理 8.模拟 9.数据转载 2008-07-25 20:48:00 · 798 阅读 · 0 评论 -
根据经纬度计算球面距离
double zz(double s){ return (s * 3.1415927 / 180.0);}double sqr(double s){ return s * s;}double distance(double alongitude, double alatitude, double blongitude, double blatit原创 2011-11-15 13:05:38 · 1352 阅读 · 0 评论
分享