挑战程序设计竞赛
qzq2514
越努力,越幸运~
博客地址:http://blog.csdn.net/qzq2514
github: https://github.com/qzq2514
展开
-
Maximum Profit
在学期的考试复习忙过去后,寒假终于可以做自己更喜欢的事情—学习算法和刷题。在我们高中ACM大神的推荐下,买了一本《挑战程序设计竞赛》,有兴趣的同学可以跟着我这寒假的系列博客一起学习,慢慢向大神进阶~ 话不多说,开始今天的博客~题目: 外汇交易可以通过兑换不同国家的货币以赚取汇率差。比如1美元兑换100日元时购入1000美元,然后等汇率变动到一美元兑换108日元时再卖出,这样就可以赚取(原创 2017-01-14 12:16:40 · 550 阅读 · 0 评论 -
背包问题的递归形式解
背包问题是学习算法和数据结构时肯定会接触到的,我老早就了解到这个问题,可直到今天看到《挑战》书上才详细了解这个问题.该问题的题设和要求如上。拿到这个问题,最先想到的思路就是利用递归针对每个物品是否放入背包进行两种情况下的搜索。详细的源码和解释如下:原创 2017-02-13 16:22:48 · 4512 阅读 · 2 评论 -
背包问题的动态规划形式解
我们在利用递归解决背包问题时,我们使用了记忆化搜索(详见背包问题的递归形式解),我们其实可以发现在当前参数的递归函数,其返回的值与其拥有临近参数的递归函数的返回值是有关系的。在借鉴了记忆化搜索的思路下,我们其实可以想想,如果要求指定参数的递归函数的返回值,那么如果其临近参数的递归函数的返回值都已经存储在数组中,如dp[][]中,那么我们不需要不断调用递归,直接通过dp数组中的值并通过一定的递推式就原创 2017-02-13 16:48:49 · 334 阅读 · 0 评论 -
初等数据结构之链表
今天介绍一个非常简单的数据结构--链表,对于很多人这时一种非常易理解的数据结构。 顾名思义,这种数据结构的特点就是每个元素之间被一条条的链子关联着,就像铁链一样。 在这条链条上的每个铁环我们成为“结点”,而每个铁环之间的挂钩我们使用“指针来实现”。链表这种数据结构有好几种形式,像单向不循环链表,单向循环链表,双向循环链表等等,这里我们就介绍其中最复杂的双向循环链表,其包含了其它几种形式链表的所有知识点。 链表中的每个结点,我们使用C++中的结构体来实现,并将节点元素值和”铁环原创 2017-01-26 15:04:23 · 463 阅读 · 0 评论 -
在指定长度的棍子中找到能组成最大周长三角形的三根棍子
在给定的一组代表棍子长度的数组中,找到三根棍子,可以构成三角形,并且该三角形是能组成的三角形中周长最大的。 拿到这题,首先最能想到的一个方法就是三重循环的方法,把所有三根棍子的组合罗列出来,并对其中能组成三角形的周长与之前找到的最大周长比较,大于原先的最大周长,则更新最大周长。(判断构成三角形的充要条件:最长棍子的长度<其余两个棍子长度之和)原创 2017-01-26 22:29:36 · 3665 阅读 · 1 评论 -
C++标准库之vector和list
在算法比赛中,想要使用数据结构来存放数据,虽然之前介绍了栈,队列,链表等,但是在比赛中的有限时间中,我们不可能自己动手通过基本的数组,链表来组合或包装来获得自己需要的数据结构,所以掌握C++标准库中已经封装好的数据结构就显然成为一种不得不做的事。其实在之前介绍队列和栈时,我的源代码中就已经使用了标准库中的stack和queue,那么今天就介绍下标准库中另外两个基本的数据结构---vertor和list原创 2017-01-28 17:39:19 · 439 阅读 · 0 评论 -
矩阵链乘法问题
题目: 拿到这道题,我们首先要知道矩阵相乘的规则和过程,具体的乘法过程如下:原创 2017-02-19 14:32:32 · 929 阅读 · 0 评论 -
栈匹配法求水坑面积
题目: 输入:用"/"和"\"代表地形断面图中的斜面,用"_"代表平面。在第一行之内完成输入。例如上图中通过字符串: \\///\\_/\\/\\\\/_/\\///输入。 输出:第1行输出该地区积水处横截面的总面积A(正数) 第2行从左至右按顺序输出积水处的数量k,以及各积水处的横截面积Li(i=1,2,......,k),相邻数据用空格隔开 限制:1<=字符串的长度<=2000 输入示例:原创 2017-01-29 21:09:32 · 709 阅读 · 2 评论 -
优先队列之加油站最小加油次数
分析:这里最笨的方法是使用递归下的深度优先搜索(为啥感觉好像每个题目都可以深度搜索一样,蜜汁尴尬),对于每个加油站,有加油和不加油两个选择。然而在看到限制条件中1 我们结合下实际情况:我们想象下,车子在还有油时,不断向前行驶,每遇到一个加油站i时,都把Bi量的油放在车上,注意这并不是给油缸加油,只是相当于放在后备箱了,然后在车子没有油时,从后备箱选择一个油量最大的进行加油,这样不原创 2017-02-22 21:52:00 · 2695 阅读 · 0 评论 -
传送带装载货物的最优解问题
题目:传送带上依次送来了重量分别为:Wi(i=0,1,2,3.......,n-1)的n个货物。现在要将这些货物装到k辆卡车上。每辆卡车可装载的货物数大于等于0,但货物的重量总和不得超过卡车的最大运载量P.所有卡车的最大最大运载量一致。请编写一个程序,输入n,k,Wi,求出装载全部货物所需的最大运载量P的最小值。输入:第一行输入n和整数k,用空格隔开。接下来n行输入n个整数Wi,每个数占一行。输出:输出P的最小值,占一行。限制:1<=n<=10000 1<=k<=10原创 2017-02-11 16:08:01 · 3077 阅读 · 0 评论 -
BFS和DFS下的拓扑排序
DAG是一种有向无环图,可以用来表示各种事务执行的先后顺序,而拓扑排序的作用就是找到恰当的工作顺序,使得对于所有有向边,都保证顶点u出现在顶点v之前。具体的拓扑排序的形象解释我这里就不多废话了,下面直接附上两种搜索形式下的拓扑排序: 1.广度优先搜索实现的拓扑排序:#include#include#includeusing namespace std;#define Max原创 2017-03-13 22:26:41 · 1469 阅读 · 1 评论 -
霍夫曼树之切割木板最小总代价问题
对于本题的切割方案,在给出了最终的切割结果后,我们其实可以使用倒推的方法,将最终的小木板不断合成大木板,大木板的长度就是本次合并的开销,和相同条件下的切割的开销是一样的。这样想的话,想要总开销小的话,其实想想的话,就可以知道,肯定是不断先合并最小的.因为比如一个小木块a合并成大木块b之后大木块b又和别的木块合并成大木块c,那么大木块中的开销其实包含了原先小木块a的两倍长度,并且大木块c继续合并原创 2017-02-12 22:49:42 · 2544 阅读 · 1 评论 -
贪心算法之区间调度问题
分析:拿到这道题目,首先要看清楚最终的题目要求,它的要求是参与尽可能多的工作,并不是说工作总时间最长。对于这题我们其实可以使用贪心算法,就是不断选取当前最优策略我们不断选取工作,其实可以有以下几种思路进行选取,并进行聚反例来排除这种思路:1.在可选的工作中,选取开始时间最早的. 反例: 这种情况下先根据开始最早原则选取3号工作,这样剩下的1,2工作原创 2017-02-12 10:19:03 · 3301 阅读 · 1 评论 -
初等排序之插入排序
插入排序是将指定的数据插入到已经排序好的数列中,举一个简单的小例子: 相信大家都打过扑克牌,在整理扑克牌时,对扑克牌进行排序,就是将待排序的扑克牌一张张地与已经整理好的扑克牌进行比较,在找到合适的位置时直接将牌插入其中即可。下面以具体的数字进行演示:原创 2017-01-15 23:46:54 · 265 阅读 · 0 评论 -
初等排序之希尔排序
对于插入排序,我们其实不难发现如果数据本来就基本有序,那么数据插入移动的次数就会非常少。要注意这里这里说的基本有序不等于局部有序,例如下面的数列可以当做基本有序:{1,2,8,4,5,6,7,3},是整体而言,而局部有序的例子如下:{6,7,8,9,1,2,3,4,5},这里只是数据的部分有序,对于整体而言,其实移动次数不会减少太多。其实这也是非常不好量化的概念,总之,大家要知道的是,简单的插入排序是有办法优化的,而优化的方法就如下原创 2017-01-16 23:21:32 · 397 阅读 · 0 评论 -
初等排序之冒泡排序
冒泡排序又叫起泡排序,是交换排序中最简单的排序方法,基本思想就是两两相邻的记录比较,在反序(指排列顺序与最终所需要的排序顺序相反)时则交换,正序则不变化。其余的也不多说,以一个例子进行形象的介绍:原创 2017-01-15 17:49:46 · 364 阅读 · 1 评论 -
初等排序之选择排序
选择排序,顾名思义,就是不断选择剩余数列中的最大值,然后再进行排序,是一个比较简单的排序算法,所以就直接以一个实例用图像的方式介绍下:原创 2017-01-17 11:04:05 · 299 阅读 · 0 评论 -
二叉树的重建
题目:现有两个节点序列,分别是同一个二叉树进行前序遍历和中序遍历的结果。请编写一个程序,输出该二叉树按后序遍历时的节点序列。输入: 第一行输入二叉树节点数n. 第二行输入前序遍历的节点编号序列,相邻编号用空格隔开。 第三行输入中序遍历的节点编号序列,相邻编号用空格隔开。 节点编号是从1至n的整数。注意,1不一定是根节点。输入:在一行中输出按后序原创 2017-02-16 20:39:56 · 330 阅读 · 0 评论 -
动态规划之多重部分和问题
分析:拿到这道题目,当然可以用递归的形式进行深度搜索遍历每种情况,但是效率会非常低。一般递归带有前后数值关系的递归是可以用动态规划转化的,效率会提高很多。 至于动态规划,最重要的就是准确定义动态数组的意义并找准前后的递推式.我们这里定义dp[i][j]为bool类型,其意义表示为用前i种数(下标为0~i-1)能否凑成和j,能的话则dp[i][j]=true,反之则dp[i][j]=false原创 2017-02-17 23:09:15 · 1909 阅读 · 0 评论 -
初等数据结构之队列
数据结构中还有个比较常用的就是队列,相比较于之前一篇介绍的栈的“后入先出”的特点,队列的特点就是“先进先出” 类比于栈,其实很容易就能知道队列的“先进先出”特点的具体意义,不过下面我还是会用图片的形式形象介绍下~在介绍之前,首先要知道队列的几个比较重要的方法,我们利用enqueue(x)向队列队尾添加元素x,dequeue()则是弹出队首元素,同时类似于栈的top指针,我们还使用head指针指向队首元素,tail指向队尾元素的后一个位置(这样指定的原因是为了进行队空的判断)。原创 2017-01-20 14:28:47 · 369 阅读 · 0 评论 -
递归与非递归下二叉查找数的插入·查找和删除
至于二叉查找数的特性和上述三个操作的具体分析我就不多阐述,具体直接看代码,注释中有解释和部分分析: 非递归:#include#includeusing namespace std;struct Node{ int key; Node *right,*left,*parent;};Node *root,*Nil;//插入 void insert(int k){ Nod原创 2017-02-19 23:47:34 · 413 阅读 · 0 评论 -
搜索之线性搜索和二分搜索
今天介绍下搜索的方法,其实对于今天介绍的两种搜索方式是很简单的,尤其是线性搜索,但是本着完整性的心态,还是不想把搜索这章中两种简单的方法漏掉,那就稍微简单介绍下吧。注意:本博文介绍的搜索都是不含重复元素的搜索,至于重复下的搜索,只需用到另外一个数据结构用来存放这多个重复元素的下标就行了,就不多作介绍。原创 2017-02-04 22:45:48 · 2973 阅读 · 1 评论 -
搜索之散列法建立简易字典
要知道的是,散列法搜索不像昨天介绍的两种搜索方式,线性搜索和二分搜索中元素可以排列在任意位置,而散列法搜索则是根据各元素的值来确定存储位置,然后将位置保管在散列表中,从而实现数据的高速搜索。其中散列表是一种数据结构,能对包含关键字的数据集合高效地执行动态插入,搜索,删除操作。虽然链表也能完成同样操作,但搜索和删除的复杂度都高达O(n). 散列表由能容纳m个元素的数组T,以及根据关键字决定数组下标的函数共同组成。就像上面所说的,元素的位置室友元素值决定的,这就比较像一个字典了。散列表大致可通原创 2017-02-05 11:34:08 · 592 阅读 · 0 评论 -
初等数据结构之栈
今天介绍的是栈的知识。其实稍微了解一点的同学,用一句话就可以概括栈的特点,就是后入先出,也就是后保存的数据,在需要提取数据时是最先被提取的。现在使用push(x)方法表示向栈中添加数据,pop()表示弹出最新进栈的数据,top表示栈顶的元素,则下面用图片表示进栈入栈时栈中数据的变化情况:原创 2017-01-18 23:02:38 · 465 阅读 · 3 评论