
算法
文章平均质量分 73
sjf0115
Stay Hungry, Stay Foolish---我们必须用谦虚者的自觉,饥饿者的渴望的求职态度,来拥抱我们的未来。
展开
-
算法之二叉树各种遍历
树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作二叉查找树和二叉堆或是二叉排序树。二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2的 i -1次方个结点;深度原创 2013-03-07 04:51:48 · 208485 阅读 · 47 评论 -
素数总结
原创 2013-02-12 15:47:19 · 1114 阅读 · 1 评论 -
sscanf()总结
在做一道九度上机题时,突然发现sscanf()函数非常有用,就顺便从网上搜集资料整理一下。 sscanf() 的作用:从一个字符串中读进与指定格式相符的数据.原型: int sscanf (const char *str,const char * format,........);说明: sscanf()会将参数str的字符串根据参数format字符串来转换并格式化原创 2013-02-13 15:20:09 · 40155 阅读 · 11 评论 -
string.h总结
转载 2013-02-09 17:46:49 · 1068 阅读 · 0 评论 -
memset用法详解
memest原型 (please type "man memset" in your shell) void *memset(void *s, int c, size_t n); memset:作用是在一段内存块中填充某个给定的值,它对较大的结构体或数组进行清零操作的一种最快方法。 常见的三种错误 第一: 搞反了c 和 n的位置. 一定要记住 如果要把一个char原创 2012-06-29 09:57:03 · 2230 阅读 · 1 评论 -
如何计算某一天是星期几?
如何计算某一天是星期几?—— 蔡勒(Zeller)公式 历史上的某一天是星期几?未来的某一天是星期几?关于这个问题,有很多计算公式(两个通用计算公式和一些分段计算公式),其中最著名的是蔡勒(Zeller)公式。即w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1公式中的符号含义如下,w:星期;c:世纪-1;y:年(两位数);m:月(m大于等于3,小于等于14,即转载 2013-01-11 23:24:03 · 1811 阅读 · 0 评论 -
qsort及其用法
qsort及其用法一、 函数原型voidqsort(void*base, size_t num, size_t width, int (__cdecl *compare )(constvoid*elem1, constvoid*elem2));大概的意思是,第一个参数指明了要排序的数组(比如:程序中的num),第二个参数给出了数组的大小(qsort没有足够的智力预知你传给它的数组的实际原创 2012-06-25 07:57:06 · 2483 阅读 · 1 评论 -
458 - The Decoder
/*******************************题号:458 - The Decoder *作者:SJF*时间:2010-8-9*结果:AC*说明:根据题意找规律 解码与源码相差7***************************/#include #include using namespace std;int main(){原创 2011-11-17 15:11:01 · 915 阅读 · 0 评论 -
UVA 494 - Kindergarten Counting Game
/*******************************题号:494 - Kindergarten Counting Game*作者:SJF*时间:2010-8-9*结果:AC*说明:用sign进行标记,判断字符串是否为一个单词***************************/#include #include using namespace st原创 2011-11-17 15:11:51 · 1157 阅读 · 0 评论 -
汽车加油问题(贪心)
/*日期:2011-10-20 作者:xiaosi 题目:汽车加油问题(贪心)*/#include#include#includeusing namespace std;int gas_station[1000];int main(){ int n,k; while(scanf("%d %d",&n,&k)!=EOF) {原创 2011-10-20 20:05:36 · 1941 阅读 · 0 评论 -
最优服务次序问题(贪心)
/*日期:2011-10-20 作者:xiaosi 题目:最优服务次序问题(贪心) 题目连接:http://acm.sdut.edu.cn/judgeonline/showproblem?problem_id=1747*/#include#include#includeusing namespace std;int Time[1000];int cmp原创 2011-10-20 20:36:22 · 1770 阅读 · 0 评论 -
程序存储问题(贪心)
/*日期:2011-10-20 作者:xiaosi 题目:程序存储问题(贪心)*/#include#include#includeusing namespace std;int program[10000];int cmp(const void *a,const void *b){ return *(int *)a-*(int *)b;}原创 2011-10-20 19:16:54 · 3242 阅读 · 1 评论 -
数列极差问题(贪心) 求数据(一直Wrong)
/*日期:2011-10-21 作者:xiaosi 题目: 数列极差问题(贪心)*/#include#include#include#includeusing namespace std;#define Maxint 999999#define Minint -1int progression[2001];int progression1原创 2011-10-22 08:57:25 · 1382 阅读 · 0 评论 -
KMP字符串模式匹配详解
个人觉得这篇文章是网上的介绍有关KMP算法更让人容易理解的文章了,确实说得很“详细”,耐心地把它看完肯定会有所收获的~~,另外有关模式函数值next[i]确实有很多版本啊,在另外一些面向对象的算法描述书中也有失效函数 f(j)的说法,其实是一个意思,即next[j]=f(j-1)+1,不过还是next[j]这种表示法好理解啊:转载 2013-02-12 19:26:06 · 10701 阅读 · 4 评论 -
中国剩余定理
内容 公元前后的《孙子算经》中有“物不知数”问题:“今有物不知其数,三三数之余二 ,五五数之余 三 ,七七数之余二,问物几何?”答为“23”。也就是求同余式组x≡2 (mod3),x≡3 (mod5 ),x≡2 (mod7)(式中a≡b (modm)表示m整除a-b )的正整数解。明朝程大位用歌谣给出了该题的解法:“三人同行七十稀,五树梅花廿一枝,七子团圆月正半,除百零转载 2013-02-12 15:41:46 · 5939 阅读 · 0 评论 -
算法:字符串消除问题的数学证明
问题:给定一个字符串,仅由A、B、C3个字母组成。当出现连续两个不同的字母时,你可以用另外一个字母替换它,如有AB或BA连续出现,你把它们替换为字母C;有AC或CA连续出现时,你可以把它们替换为字母B;有BC或CB连续出现时,你可以把它们替换为字母A。可以不断反复按照这个规则进行替换,目标是使得最终结果所得到的字符串尽可能短,求最终结果的最短长度。输入:字符串。长度不超过200,仅转载 2013-11-03 15:24:41 · 4997 阅读 · 0 评论 -
算法之最长递增子序列,最长公共子序列
练习:拦截导弹 最大上升子序列和转载 2013-03-25 10:16:01 · 5360 阅读 · 1 评论 -
算法之素数筛法
方法一//判断是否是一个素数int IsPrime(int a){ //0,1,负数都是非素数 if(a <= 1){ return 0; } //计算枚举上界,为防止double值带来的精度损失,所以采用根号值取整后再加1,即宁愿多枚举一个,也不愿少枚举一个数 int bound = (int)sqrt(a) + 1; for(int i = 2;i < b原创 2013-03-20 09:08:15 · 11497 阅读 · 4 评论 -
浅谈大数的进制转换
在数据结构课关于栈的这一章中,我们都学过用“模2取余法”来将一个10进制数转换为一个二进制数,进而可以推广到“模n取余法”,经其转换为n进制(n任意指定)。确实,这是一个很基础的题目,可你是否想过如果这个10进制数是一个大数(其位数可能上千位,此时用一般数据类型肯定是会溢出的),那么这个问题又如何来求解呢?当然,也许你会说很简单嘛,自己写一个大数类(当然至少要写一个大数除法才行),或者你用转载 2013-03-19 10:47:41 · 11953 阅读 · 0 评论 -
算法之优先级队列
概念优先级队列,顾名思义,就是一种根据一定优先级存储和取出数据的队列。它可以说是队列和排序的完美结合体,不仅可以存储数据,还可以将这些数据按照我们设定的规则进行排序。优先级队列是堆的一种常见应用。有最大优先级队列(最大堆)和最小优先级队列(最小堆)。优先级队列是一种维护有一组元素构成的集合S的数据结构。优先队列支持的基本运算//建立一个保存元素为int的优先级队列,其实是建了一个小原创 2013-03-16 08:47:23 · 6085 阅读 · 0 评论 -
算法之二叉树中序前序序列(或后序)求解树
这种题一般有二种形式,共同点是都已知中序序列。如果没有中序序列,是无法唯一确定一棵树的。已知二叉树的前序序列和中序序列,求解树。1、确定树的根节点。树根是当前树中所有元素在前序遍历中最先出现的元素。2、求解树的子树。找出根节点在中序遍历中的位置,根左边的所有元素就是左子树,根右边的所有元素就是右子树。若根节点左边或右边为空,则该方向子树为空;若根节点边和右边都为空,则根节点已经为叶原创 2013-03-08 10:56:18 · 21252 阅读 · 3 评论 -
ACM进阶之路
第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码, 因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打 出来. 1.最短路(Floyd、Dijstra,BellmanFord) 2.最小生成树(先写个prim,kruscal要用并查集,不好写) 3.大数(高精度)加减乘除 4.二分查找. (代码可在五行以内)转载 2013-03-12 16:50:03 · 11370 阅读 · 0 评论 -
算法之中缀表达式和后缀表达式
一、后缀表达式求值后缀表达式也叫逆波兰表达式,其求值过程可以用到栈来辅助存储。假定待求值的后缀表达式为:6 5 2 3 + 8 * + 3 + *,则其求值过程如下:(1)遍历表达式,遇到的数字首先放入栈中,依次读入6 5 2 3 此时栈如下所示:(2)接着读到“+”,则从栈中弹出3和2,执行3+2,计算结果等于5,并将5压入到栈中。(3原创 2013-03-11 22:15:16 · 2796 阅读 · 1 评论 -
算法之堆排序
前序:(二叉)堆数据结构是一种数组对象,它可以被视为一棵完全二叉树。树中每个节点与数组中存放该节点值的那个元素对应。树的每一层都是填满的,最后一层除外。树的根为a[1] (在这里是从1开始的,也可以从0开始),给定了某个节点的下标i,其父节点为i/2,左二子为2*i,右儿子为2*i+1。二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)任何一个原创 2013-02-25 16:57:43 · 1798 阅读 · 1 评论 -
算法之快速排序
快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。 总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快转载 2013-02-22 22:31:00 · 1504 阅读 · 0 评论 -
国内外ACM/ICPC的OJ,BBS列表
北京邮电大学 http://acm.scs.bupt.cn/onlinejudge/(推荐) 北京大学 http://acm.pku.edu.cn/JudgeOnline/ (推荐) http://poj.grids.cn/(内部) 浙江大学 http://acm.zju.edu.cn/ (推荐) 天津大学 http://acm.tju.edu转载 2013-02-20 22:31:47 · 2673 阅读 · 0 评论 -
数组和字符串总结
动态开辟二维数组有时根据题意需得根据输入的二维数来动态的创建二维数组,那么此时就不能想以前一样直接定义多少行多少列了。因为不知道行列多少,假如设定太大浪费空间,申请太小完成不了程序的数据存储。因此需要合理的开辟二维空间。例子:开辟10行20列char **str = (char **) malloc( sizeof(char*) *10);for(i = 0;i < 10;i++原创 2013-02-14 10:50:03 · 1857 阅读 · 1 评论 -
区间覆盖问题(贪心)
/*日期:2011-10-20 作者:xiaosi 题目:区间覆盖问题(贪心)*/#include#include#includeusing namespace std;int num[10000];int cmp(const void *a,const void *b){ return *(int *)a-*(int *)b;}int原创 2011-10-20 18:53:42 · 1198 阅读 · 1 评论 -
会场安排问题(贪心)
/*日期:2011-10-17 作者:xiaosi 题目:会场安排问题(贪心) 题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=14*/#include#include#includeusing namespace std;struct Activity{ int begin;原创 2011-10-20 21:17:30 · 957 阅读 · 0 评论 -
P08: 泛化物品
P08: 泛化物品定义考虑这样一种物品,它并没有固定的费用和价值,而是它的价值随着你分配给它的费用而变化。这就是泛化物品的概念。更严格的定义之。在背包容量为V的背包问题中,泛化物品是一个定义域为0..V中的整数的函数h,当分配给它的费用为v时,能得到的价值就是h(v)。这个定义有一点点抽象,另一种理解是一个泛化物品就是一个数组h[0..V],给它费用v,可得到价值h[V]。一个转载 2011-11-25 11:14:23 · 865 阅读 · 0 评论 -
P06: 分组的背包问题
P06: 分组的背包问题问题有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。算法这个问题变成了每组物品有若干种策略:是选择本组的某一件,还是一件都不选。也就是说设f[k][v]表示前k组物品花费费用v能取得的最大权值,则有转载 2011-11-25 11:10:50 · 1112 阅读 · 0 评论 -
P04: 混合三种背包问题
P04: 混合三种背包问题问题如果将P01、P02、P03混合起来。也就是说,有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包)。应该怎么求解呢?01背包与完全背包的混合考虑到在P01和P02中给出的伪代码只有一处不同,故如果只有两类物品:一类物品只能取一次,另一类物品可以取无限次,那么只需在对每个物品应用转移方程时,根据转载 2011-11-25 11:09:45 · 791 阅读 · 0 评论 -
P02: 完全背包问题
P02: 完全背包问题题目有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。基本思路这个问题非常类似于01背包问题,所 不同的是每种物品有无限件。也就是从每种物品的角度考虑,与它相关的策略已并非取或不取两种,而是有取0件、取1件、取2件……等很多种。如果仍然转载 2011-11-25 11:07:07 · 901 阅读 · 0 评论 -
P03: 多重背包问题
P03: 多重背包问题题目有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。基本算法这题目和完全背包问题很类似。基本的方程只需将完全背包问题的方程略微一改即可,因为对于第i种物品有n[i]+1种策略:取0件,取1件……取n[i]件。令f[i][v]表示前i种转载 2011-11-25 11:09:09 · 836 阅读 · 0 评论 -
P09: 背包问题问法的变化
P09: 背包问题问法的变化以上涉及的各种背包问题都是要求在背包容量(费用)的限制下求可以取到的最大价值,但背包问题还有很多种灵活的问法,在这里值得提一下。但是我认为,只要深入理解了求背包问题最大价值的方法,即使问法变化了,也是不难想出算法的。例如,求解最多可以放多少件物品或者最多可以装满多少背包的空间。这都可以根据具体问题利用前面的方程求出所有状态的值(f数组)之后得到。还有,如果要转载 2011-11-25 11:14:53 · 905 阅读 · 0 评论 -
递归与分治之 棋盘覆盖
/* 时间:2011-10-9 作者:xiaosi 题目:棋盘覆盖*/#include"stdio.h"#includeusing namespace std;int tile=1;//表示L型骨牌的编号int Board[4][4]={0};//定义棋盘并初始化棋盘void ChessBoard(int tr,int tc,int dr,int dc,int size原创 2011-11-24 15:04:09 · 1030 阅读 · 0 评论 -
快速排序
快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快速排序转载 2011-11-24 15:00:37 · 832 阅读 · 0 评论 -
生产者与消费者问题
#include #include #include #include // Windows#ifdef _WIN32#ifndef WIN32#define WIN32#endif#endif#ifdef WIN32#include #include #define GET_TIME(t) t=clock()#define SLEEP(millis) Sleep(m转载 2011-11-23 10:29:58 · 1047 阅读 · 0 评论 -
回溯法之n皇后问题
/* 时间:2011-11-21 作者:xiaosi 题目:n皇后问题*/#include#include#includeusing namespace std;#define M 100class Queen{ friend void nQueen(); private: void Backtrack(int t); b原创 2011-11-21 22:11:19 · 1267 阅读 · 0 评论 -
回溯法之最少重量机器设计问题
#include#includeusing namespace std;#define Z 100class MinMechine{ friend void Mechine(); private: void Backtrack(int t); int N; //部件个数 int M; //供应商个数 int原创 2011-11-15 18:09:29 · 4709 阅读 · 0 评论