算法
司青-已停止更新
本博客已停更;
展开
-
【ACM】做题总结
通过最近几周的折腾和学习,我似乎总结出了一套做题的套路。现在将其用算法的形式写出来:S1:仔细审题,注意题中给出的变量的最大值,小心陷阱S2:用最便捷的方法获取输入数据S3:设计算法S4:根据算法选择合适的数据结构S5:写代码,并添加必要的注释(注释非常重要)S6:用已知数据测试写好的程序,找出一些浅显的BUG并修正之S7:提交。如果WA,则想办法将错误数据重现原创 2012-10-30 21:58:48 · 905 阅读 · 0 评论 -
【动态规划】最长公子序列 - dp
问题描述:求出两个字符串中的最长公子序列的长度。输入:cnblogbelong输出:max length = 4#include #include int arr[200][200]; /* 表示str1的前i位和str2的前j位的最长公子序列的长度 */int main(){ ch原创 2013-01-30 15:08:15 · 1466 阅读 · 0 评论 -
【栈】铁轨问题
经典栈问题!第一次做的时候思路太混乱了,现在看了刘汝佳的书,重新整理下。#include #include /******************************************************************* 用数组A存储调整前的车厢号序列,用数组B存储调整好的车厢号序列* 用栈stack存储存放在中转站C中的车厢* 用ix_A指原创 2012-12-03 17:49:10 · 1691 阅读 · 0 评论 -
【图】图的邻接表存储和广度优先遍历
示例:建立如图所示的无向图由上图知,该图有5个顶点,分别为a,b,c,d,e,有6条边.示例输入(按照这个格式输入):56abcde0 10 20 32 32 41 4输入结束(此行不必输入)注:0 1表示该图的第0个顶点和第1个定点有边相连,如上图中的a->b所示原创 2012-11-19 15:36:35 · 2348 阅读 · 0 评论 -
【图】图的邻接矩阵存储和广度、深度优先遍历
示例:建立如图所示的无向图由上图知,该图有5个顶点,分别为a,b,c,d,e,有6条边.示例输入(按照这个格式输入):56abcde0 1 10 2 10 3 12 3 12 4 11 4 1输入结束(此行不必输入)注:0 1 1表示该图的第0个顶点和第1个定点有边相连,如上图中的a原创 2012-11-18 21:52:36 · 2113 阅读 · 0 评论 -
【二杈树】非递归建立二杈树
思路:设置一个标记变量flag并初始化为1. flag = 1表示现在需要创建当前结点的左孩子,2表示需要创建右孩子,3则表示当前结点的左右孩子都已经创建完毕,需要执行出栈操作,直到当前结点不是父结点的右孩子为止。以先序创建如图所示二杈树:PBTree create(){ char ch[20]; scanf("%s",ch); int len = strlen(c原创 2012-11-16 12:33:55 · 1110 阅读 · 0 评论 -
表达式求值 - Java实现
本程序用于计算任意四则运算表达式。如 4 * ( 10 + 2 ) + 1 的结果应该为 49。算法说明:1. 首先定义运算符优先级。我们用一个Map>来保存优先级表。这样我们就可以通过下面的方式来计算两个运算符的优先级了:/** * 查表得到op1和op2的优先级 * @param op1 运算符1 * @param op2 运算符2 * @retur原创 2014-06-22 22:04:27 · 6301 阅读 · 0 评论 -
利用广度优先遍历(BFS)计算最短路径 - Java实现
我们用字符串代表图的顶点(vertax),来模拟学校中Classroom, Square, Toilet, Canteen, South Gate, North Gate几个地点,然后计算任意两点之间的最短路径。 如,我想从North Gate去Canteen, 程序的输出结果应为: BFS: From [North Gate] to [Canteen]: North Gate原创 2015-03-15 02:46:54 · 10784 阅读 · 0 评论 -
判断单向链表中是否有环和查找环的入口
快慢指针算法描述定义两个指针slow, fast。slow指针一次走1个结点,fast指针一次走2个结点。如果链表中有环,那么慢指针一次会再某一个时刻追上快指针(slow == fast)。如果没有环,则快指针会第一个走到NULL。实现结点定义如下:class Node { public Node next; public Object data; public static原创 2015-08-01 13:24:30 · 6489 阅读 · 0 评论 -
递归计算战士打靶S次打了N环一共有多少种可能的问题
问题描述一个战士打了10次靶,一共打了90环,问一共有多少种可能,并输出这些可能的组合。思路首先,嵌套10层循环进行穷举是不可取的,一是因为速度太慢,二是如果改成打20次靶就完蛋了。其实这就是一个树的搜索问题。 1. 设第一次打了0环,那么第二次可能打0 ~ 10环这些可能 2. 以第一次打的0环为root,将第二次所有可能的环数都做为root的子结点 3. 重复1, 2步这样就构成了一原创 2015-07-25 20:38:34 · 1474 阅读 · 0 评论 -
【LeetCode】Reverse Integer Go语言实现
问题描述Reverse digits of an integer.Example1: x = 123, return 321 Example2: x = -123, return -321题意很明确,将一个整数反转输出。思路首先不用考虑用库函数先转为字符串再反转的方式,这根本不是算法。 整体解决思路为,依次取出整数的每一位数,然后反转,再组装成整数即可。有几个点需要考虑:取末位数。 num %原创 2016-11-23 11:32:51 · 1561 阅读 · 0 评论 -
【LeetCode】Add Two Numbers Go语言实现
问题描述You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a l原创 2016-11-23 11:14:19 · 2060 阅读 · 2 评论 -
【leetcode】通过递归反转单链表 - Go语言实现
问题描述见leetcode第206题:https://leetcode.com/problems/reverse-linked-list/#/description思路使用迭代的方式反转链表大家已经很熟了,其实递归调用栈的特性,我们也可以轻松做到链表反转。 链表反转后,原链表的最后一个结点,会变成新表的头结点。因此我们可以设递归函数总是返回当前链表的最后一个结点,这样最深的一层递归调用就是原链表的原创 2017-05-07 11:08:14 · 3166 阅读 · 0 评论 -
【字典树】杭电1251 : 统计难题
字典树的基本功能是用来查询某个单词(前缀)在所有单词中出现次数的一种数据结构,它的插入和查询复杂度都为O(len),Len为单词(前缀)长度,但是它的空间复杂度却非常高,如果字符集是26个字母,那每个节点的度就有26个,典型的以空间换时间结构。统计难题Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 13原创 2013-02-05 16:07:05 · 1413 阅读 · 0 评论 -
【字典树】杭电1671 : Phone List
Phone ListTime Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5747 Accepted Submission(s): 1973Problem DescriptionGiven a list of原创 2013-02-05 20:46:40 · 1745 阅读 · 0 评论 -
【字典树】Message Flood - 第9届中山大学程序设计竞赛预选赛
Message FloodTime Limit: 1500MS Memory limit: 65536K题目描述Well, how do you feel about mobile phone? Your answer would probably be something like that "It's so convenient and benefits p原创 2013-02-20 13:25:43 · 1329 阅读 · 0 评论 -
【ACM】杭电1070:Milk
思路分析:先求出每个品牌平均每天的花费,再比较这些平均花费的大小,选择最小的即可。如果平均花费相同,则选择容量大的品牌。可以用一个结构体来储存品牌相关信息:struct brand{ char ch[120]; int price; int v; double ave; /* the average cost of one day */};typedef struct bra原创 2012-10-31 21:03:19 · 1666 阅读 · 0 评论 -
【ACM】杭电1073:Online Judge
这个题出得很有意义。。自己写一个OJ系统,能让我们加深对ACM比赛规则的理解。分析:这道题需要解决的问题有2个:1、数据输入问题。即如何才能以START串开始,END串结束。并把这两个字符串之间的内容储存起来(可能有有多行数据,可能有空格,换行)。解决的方法是,do..while循环:用gets获取每一行输入的字符串后,紧接着用getchar获取到下一次输入的前3个字符,如果这3个字符原创 2012-10-31 21:14:52 · 1685 阅读 · 1 评论 -
【ACM】杭电1022:Train Problem I
分析:明显是一个栈的问题。利用栈后进先出的特点模拟火车进站出站的过程即可轻松解决。我的思路是:用2个字符数组保存火车车厢的序列。首先比较出站后(记为s2)数组和出站前 (记为s1)数组的第一个元素,会有以下3种情况:1、元素相等,则说明这节车厢可以进站后马上出站,直接输出in,out,不需要执行真正的压栈操作。(当然你想压再出一下也行。。不过那是没有任何意义的)2、元素不相同时原创 2012-10-28 22:57:56 · 1509 阅读 · 0 评论 -
【ACM】杭电1036:Average is not Fast Enough!
这道题的大意是让你来计算各个接力队的平均速度。输入的第一个数N意思是比赛的节数,第二个数D 为赛道的距离,单位是千米。第二行第一个数是队伍编号,这个没有什么意义,照着输出就行了,后面是一个以h:mm:ss格式表示的时间,以空格分隔,意为这个队伍完成这一小节比赛所消耗的时间,把所有的时间加起来就是这个队跑完全程(也就是上面输入的D)所用的总时间。我们的任务是,对于每一组输入数据,输出这个队伍的平均速原创 2012-10-28 22:25:20 · 1241 阅读 · 0 评论 -
【ACM】杭电1141:Factstone Benchmark
我觉得这道题 值得一写,是因为它用到了取对数的方法来处理数值过大的阶乘问题。这种方法应该熟练掌握。分析:问题实际上可以转化成一个不等式: n ! 即求使上述不等式成立的最大的整数n.如果直接枚举的话,势必溢出。所以应该用取对数的方法来避免处理过大的数。首先对不等式两边都取自然对数,得:ln(n!) 这时候数据就被大大缩小了。代码 :#include #incl原创 2012-11-05 21:31:37 · 994 阅读 · 0 评论 -
ACM都要学什么
ACM都要学什么今天查资料发现了一份做ACM需要知道的知识的表,仔细看了看发现初级竟然还有这么大一部分不会,发现需要学的东西还有这么多。以后要加速了。初步计划一个半月在保证ACM学习小组进度和C#考试的基础上先把初级的全刷一遍,脱离菜鸟级别。初期:一.基本算法:(1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj210转载 2012-11-06 22:22:37 · 1610 阅读 · 0 评论 -
【ACM】杭电1178:Heritage from father 小心溢出!
我觉得做这个题 最大的意义就是通过NNNN次的WA让我反复而深刻地体会到了 计算过程中也会溢出 这种错误。。。。另外要把一个数用科学计数法表示,只需要两步:1、对这个数取以10为底的对数,其结果取整就是科学计数法中10需要的指数。2、用这个数除以 【10 ^ (步骤一的结果)】就是科学计数法的有效数字。代码:#include #include /* Sn = n(n+1原创 2012-11-07 18:58:15 · 1217 阅读 · 0 评论 -
【ACM】杭电1200:To and Fro
这道题非常有意思。我们只需要按照题目的要求建立一个矩阵,然后按照指定的顺序遍历就OK啦。步骤:获取暗文->还原矩阵->遍历矩阵->输出结果。代码:#include #include char word[110][30]; /* 存放字母矩阵 */int main(int argc, char *argv[]){ int COL,ROW,len,r; char ch[25原创 2012-11-07 22:32:27 · 1304 阅读 · 0 评论 -
【并查集】亲戚(Relations)
题目: 亲戚(Relations)或许你并不知道,你的某个朋友是你的亲戚。他可能是你的曾祖父的外公的女婿的外甥的表姐的孙子。如果能得到完整的家谱,判断两个人是否亲戚应该是可行的,但如果两个人的最近公共祖先与他们相隔好几代,使得家谱十分庞大,那么检验亲戚关系实非人力所能及.在这种情况下,最好的帮手就是计算机。为了将问题简化,你将得到一些亲戚关系的信息,如同Marry和Tom是亲戚,T原创 2013-02-14 19:03:57 · 2293 阅读 · 0 评论 -
【动态规划】背包问题 - dp
问题描述:背包的最大容量为W,有N件物品,每件物品重量为w,价值为p,怎样选择物品能使得背包里的物品价值最大?输入:10 3 (W,N)4 5 (w,p)6 7 (w,p)8 9 (w,p)#include #define THING 20#define WEIGHT 100int arr[THING][WEIGH原创 2013-01-30 12:45:57 · 1301 阅读 · 0 评论 -
【ACM】杭电1544:Palindromes
看到这个题第一个想法就是枚举所有的子串,然后再一个一个判断是否回文。显然,在最大串长度足足有5000个字符的情况下,肯定会超时。这时可以用另一种思想:子串为奇数时,以一个字符为中心,依次比较这个字符左边和其对应的右边的字符是否相等,如果相等则说明这是一个回文串。子串为偶数时,比较当前字符跟上一个字符是否相等,然后再向两边拓展,比较。代码如下:#include #inclu原创 2012-11-11 21:16:58 · 1195 阅读 · 0 评论 -
比较两个大文本文件的差异并输出增量和减量
现有两个4G大小、按行分割、每行为50字符(大小写字母)的text文件A, B, 现在需要在有限的内存下(如2G)以B文件为基准,计算出B相对于A增加了哪些数据和减少了哪些数据,分别以added.txt和deleted.txt命名保存。要求不能使用Spark或Hadoop这样的大数据处理框架。思路:首先使用外排序算法对A, B分别按字典序排序,输出a.sorted和b.sorted两个文件,然...原创 2019-03-09 20:53:26 · 4247 阅读 · 1 评论