随笔分类 - Algorithm
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4833 这道题目关键的思想是从后往前dp,dp[i]表示在第i处投资xi能获得的最大收益,其中xi表示从第i-1到第i处投资之间的收入总和(不包括收益),也就是用xi这些钱从第i处开始投资到最后靠x...
阅读全文
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4831 题目大概意思就是有多个风景区和休息区,每个风景区有热度,休息区的热度与最接近的分景区的热度相同,题目要求求出小于等于给定热度值的风景区和休息区的个数。显然如果直接暴力的话,复杂度为O(TKN...
阅读全文
摘要:题目描述:小度和小良最近又迷上了下棋。棋盘一共有N行M列,我们可以把左上角的格子定为(1,1),右下角的格子定为(N,M)。在他们的规则中,“王”在棋盘上的走法遵循十字路线。也就是说,如果“王”当前在(x,y)点,小度在下一步可以移动到(x+1, y), (x-1, y), (x, y+1), ...
阅读全文
摘要:题目描述:一个{1, ..., n}的子集S被称为JZP集,当且仅当对于任意S中的两个数x,y,若(x+y)/2为整数,那么(x+y)/2也属于S。例如,n=3,S={1,3}不是JZP集,因为(1+3)/2=2不属于S。但是{1,2,3}的其他子集都属于S,所以n=3时有7个JZP集给定n,求...
阅读全文
摘要:快速排序的思想与归并排序思想类似,都是采用分治法的思想。将一个数组A[l...r]使用快速排序可以分解为三个主要的步骤: 通过上面的步骤,我们就可以得到快速排序的一个框架: 从上面的代码中可以看出,分解A数组为左右两个数组是快速排序算法的关键,这个问题本质上为:对数组A中的某个值A[k](k为数组的
阅读全文
摘要:归并排序的基本思想是分治法,先将要排序的数组从中间分成两个小的数组,然后分别排序这两个小的数组,最后将这两个小的已经排序的数组合并成一个有序的数组。所以归并排序的基本框架为: 有了上面的框架,归并排序就转换为将两个已经排序的数组合并为一个大的排序数组问题。这个非常简单,只要先比较二个数组的第一个数,
阅读全文
摘要:1 题目描述: 被给一系列的正整数x1,x2,x3...xn和两个非负整数a和b,通过下面两步操作将a转化为b: 1.对当前的a减1。 2.对当前a减去a % xi (i=1,2...n)。 计算a转化到b最小需要的最短步数。2 输入 第一行包含简单的整数n(1 ≤ n ≤ 10^5),第二行包含n个用空格分开的整数x1,x2,x3...xn(2 ≤ xi ≤ 10^9),第三行包含两个整数a和b(0 ≤ b ≤ a ≤ 10^9,a - b ≤ 10^6)。3 输出 输出一个整数,a转化为b的最小步数。4 思路 假设dp[k]表示从k+b转化到b所需要的最小步数,然后可...
阅读全文
摘要:一 问题定义 给定母串S和子串T,定义n为母串S的长度,m为子串T的长度,suffix[i]为第i个字符开始的母串S的后缀子串,extend[i]为suffix[i]与字串T的最长公共前缀长度。求出所有的extend[1..n]。容易发现,如果存在某个i,使得extend[i] = m,这便是经典的KMP算法要解决的问题。二 扩展KMP算法思想 和KMP算法的是想类似,充分利用已经比较字符性质来减少冗余的字符比较次数。KMP的思想是充分的利用模式串中所有前缀字串(以模式串为开头的字串)的真前缀和真后缀(指子串的开始字符与子串的最后字符相等的个数)来减少不必要的字符比较,真前缀和真后缀相等的..
阅读全文
摘要:1 背景 后缀数组是处理字符串问题的有效算法,如最长公共字串,最长回文字串,重复次数最多的字串等等。所以学好它,对于以后处理处理字符串是很有帮助的。在网上找了下,发现对后缀数组讲的比较容易理解和清楚的是罗穗骞写的关于“后缀数组——处理字符串的有力工具”的论文,这篇文章主要总结下该论文中的主要内容。2 定义 后缀:后缀是指从某个位置 i 开始到整个串末尾结束的一个特殊子串。字符串r 的从第 i 个字符开始的后缀表示为Suffix(i) , 也 就 是Suffix(i)=r[i..len(r)]。 后缀数组:后缀数组 SA 是一个一维数组,它保存 1..n 的某个排列 SA[1],SA[2]...
阅读全文
摘要:1 题目一小Q系列故事——最佳裁判 这道题就是找最大值和最小值的题目,学过c的应该都没问题的。2 题目二小明系列问题——小明序列 这道题目是最长上升子序列的一种变形吧,就是子序列中相邻数的下标之差必须大于d(开始看错题目,以为是相邻数之差大于d,结果wa了好多次,最后看了别人的discuss才恍然大悟啊!)。用二分查找在子序列中要替换的位置,注意在处理第i个数时,才更新第i-d个数在子序列中的位置就行了,而不是原来更新第i个数在子序列中的位置。 1 #include 2 3 #define INIFITE 100000000 4 int n, d ; 5 int data[100005...
阅读全文
摘要:题目来源:网易有道2013年校园招聘面试一面试题题目描述:在印刷术发明之前,复制一本书是一个很困难的工作,工作量很大,而且需要大家的积极配合来抄写一本书,团队合作能力很重要。当时都是通过招募抄写员来进行书本的录入和复制工作的, 假设现在要抄写m本书,编号为1,2,3...m, 每本书有1 2 3 int m, k, n; //m书的本书,k抄写员的个数 4 int dp[505][505]; 5 int data[505]; //每本书的页数 6 7 #define max(a, b) (a > b ? a : b) 8 9 #define INF 10000000010 11 int
阅读全文
摘要:题目来源:微策略2013年校园招聘面试一面试题题目描述:在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往楼下跑了,然后身高矮的排在队伍的前面,身高较高的就要排在队尾。突然,有一天出操负责人想了一个主意,想要变换一下队形,就是当大家都从楼上跑下来后,所有的学生都随机地占在一排,然后出操负责人从队伍中抽取出一部分学生,使得队伍中剩余的学生的身高从前往后看,是一个先升高后下降的“山峰”形状。据说这样的形状能够给大家带来好运,祝愿大家在学习的道路上勇攀高峰。(注,山峰只有一边也符合条件,如1,1、2,2、1均符合条件)输入:输入可能包含多个测试样例。对于
阅读全文
摘要:题目来源:网易有道2013年校园招聘面试二面试题题目描述:小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的。由于小明马上就要硕士毕业了,面临着买房、买车、给女友买各种包包的鸭梨,但是他的钱包却空空如也,他需要足够的money来充实钱包。万能的网友麻烦你来帮帮小明,如何在最短时间内安排自己手中的项目才能保证赚钱最多(注意:做项目的时候,项目不能并行,即两个项目之间不能有时间重叠,但是一个项目刚结束,就可以立即做另一个项目,即项目起止时间点可以重叠)。输入:输入可能包含多个测试样例。对于每个测试案例,输入的第
阅读全文
摘要:题目来源:腾讯2012年暑期实习生招聘面试二面试题题目描述:在一个M * N的矩阵中,所有的元素只有0和1,从这个矩阵中找出一个面积最大的全1子矩阵,所谓最大是指元素1的个数最多。输入:输入可能包含多个测试样例。对于每个测试案例,输入的第一行是两个整数m、n(1=h的左右边界。则对于0101000000000011000001000来说,h[]为别为1 0 1 0 12 1 2 1 23 2 2 2 00 3 4 3 11 0 5 4 2对每一列的h[]值可以更新左右边界l[],r[]每一行初始l[j],r[j]都设为j。对于每一行依次从左到右,如果h[j] 2 #include 3 4 ..
阅读全文
摘要:题目来源:小米手机2013年校园招聘笔试题题目描述:给定一个浮点数序列(可能有正数、0和负数),求出一个最大的连续子序列乘积。输入:输入可能包含多个测试样例。每个测试样例的第一行仅包含正整数 n(n= 0,则ans[1][0] = data[1], ans[1][1] = FMAX (FMAX = -0.001, 表示最大负数)如果data[i] = 0 如果ans[i - 1][0] == ZMIN 或者 data[i] * ans[i - 1][0] data[i] ans[i][0] = data[i] * ans[i - 1][0]如果ans[i - 1][1] == FMAX ...
阅读全文
摘要:题目来源:微策略2013年校园招聘笔试题题目描述:现在有一个序列123......N,其中N介于3和15之间,要求在序列之间加入+、-或者空格,使得该序列组成的数学表达式的运算结果为0。输入:输入可能包含多个测试样例。对于每个测试案例,输入整数N(3 2 3 int n; 4 int op[20]; 5 6 void print_ans() 7 { 8 int i; 9 10 for (i = 1; i = 10)40 temp *= 10;41 temp = temp * 10 + i;42 ...
阅读全文
摘要:图像编码题目描述: 有这样一副图,它有黑白像素,黑像素的坐标在1~10之间。有很多种方法来编码这个图。例如下面的图:一种表示方法是只描述黑像素,并按x坐标的增序描述,如果x相同,则按y的增序描述,每个像素占一行。按这种编码方式的到的上面图像的编码为:62 32 43 33 44 24 3另一种表示方法是第一行包含最左边的黑像素的坐标,然后下一行是第一个黑像素的相邻黑像素,再下一行是第一个黑像素的第一个相邻黑像素的相邻黑像素(有点绕口,其实就是按bfs的方向描述),再下一行是第一个黑像素的第二个相邻黑像素的相邻黑像素,依次类推,直到描述完所有的黑像素。相邻像素的描述从右边开始,按逆时针方向,分.
阅读全文
摘要:题目要求:对于所有一个长度为N的字(这些字由0和1组成),在经过一条线路后,这些字可能会做如下的修改: 1. 0可能变成1,但只能发生一次。 2. 0或者1可能被去掉,但也只能发生一次。 3. 0或者1可能被插入到字中,但也只能发生一次。输入是字的长度n和经过线路后的字,求输入线路前的字。输入线路前的字的长度为n,字中1的位置之和要么是n+1的倍数,要么是0。如字1001,字长为4,其中1的位置之和为1+4=5,所以满足字中1的位置之和为4+1的倍数。样例输入: 4 0000 011 1011 11011样例输出: 0000 0110 1001 1111 这道题其实有...
阅读全文
摘要:正方形框 这道题目比较有意思,它在屏幕上给出了一张画有一些正方形方框的图形,这些方框可能互相覆盖,但不会超出屏幕的边界。现有要求你给出一个能构成该图形的方框序列。这些方框可以由下列字符组成: 输入:一张画有正方形框的图 输出: K X1Y1A1 … XkYkAk K代表正方框的数量,X和Y代表正方形的左上角坐标,A代表正方形的长度 样例输入: 样例输出: 6 16 11 7 32 14 4 4 8 8 11 6 7 36 11 3 28 8 3程序代码: 1 #include <stdio.h> 2 3 unsigned char map[50...
阅读全文
摘要:K进制树,版本3 题目意思是对于N位的K进制数,其中N位数不包括前导零,求有多少个这样的数满足这N位数中没有相邻的0,2 ≤K≤ 10;N≥ 2;N+K≤ 1800。 输入:N和K 输出:满足条件的N位数的个数 样例输入: 2 10 样例输出: 90思路: 这道题目可以直接用dp找出状态转移方程。设dp[n]表示n位k进制数中所能满足题目条件的数的个数,那么状态转移方程为:这个方程其实也很直接,由于第n位(最高位)只能取1~k-1的k-1个数,而第n-1位数可以取0~k-1的k个数,dp[n-1]表示的正是第n-1位取1~k-1的k-1个数的情况,而dp[n-2]表示的正是第...
阅读全文