随笔分类 - NOIP 分治与递归
摘要:1.快速排序 交换排序有:冒泡(选择)排序和快速排序,冒泡和选择排序的时间复杂度太高,思想很简单暂时不讨论,快速排序基于一种分治的思想,逐步地使得序列有序。 #include #include using namespace std;int arrs[] = { 23, 65, 12, 3, 8...
阅读全文
摘要:描述 当长度为L的一根细木棍的温度升高n度,它会膨胀到新的长度L'=(1+n*C)*L,其中C是热膨胀系数。 当一根细木棍被嵌在两堵墙之间被加热,它将膨胀形成弓形的弧,而这个弓形的弦恰好是未加热前木棍的原始位置。 你的任务是计算木棍中心的偏移距离。 输入 三个非负实数:木棍初始...
阅读全文
摘要:整体二分和CDQ分治 有一些问题很多时间都坑在斜率和凸壳上了么……感觉斜率和凸壳各种搞不懂…… 整体二分 整体二分的资料好像不是很多,我在网上找到了一篇不错的资料: 整体二分是个很神的东西,它可以把许多复杂的数据结构题化简。它的精髓在于巧妙地利用了离线的特点,把...
阅读全文
摘要:#include using namespace std; template void Perm(T a[], int k, int m) { if(k==m) { for(int i=0; i<=m; i++) c...
阅读全文
摘要:动态规划法 经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题。简单地采用把大问题分解成子问题,并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数增加(分治思想,递归方法。往往会由于数据大导致递归层次过多而超时或爆栈,即使采用记忆化等优化策略,仍然可能解决...
阅读全文
摘要:如果对汉诺塔算法的理解有困难,建议查看《程序员的数学》:第6章 递归——自己定义自己 这一章作者详细用图形介绍了汉诺塔递归算法,便于理解,茅塞顿开! 现对该算法从递归和非递归两个方面做如下总结: 1.递归算法分析如下, 设A上有n个盘子。 如果n=1,则将圆盘从A直接移动到C。 如果n...
阅读全文
摘要:引言 汉诺塔算法一直是算法设计科目的最具代表性的研究问题,本文关注于如何设计多柱汉诺塔最优算法的探究。最简单的汉诺塔是三个柱子(A、B、C),因此多柱汉诺塔的柱子个数M≥3。下面从三柱汉诺塔说起,慢慢深入我们要关心的问题。 1. 三柱汉诺塔 三柱汉诺塔是经典的汉诺塔问题,在算法设计中是递归算法的...
阅读全文
摘要:汉诺塔问题的递归实现 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一...
阅读全文
摘要:// 快速排序,是一种分治的思想。如将 7 12 3 5 8 5 选择以7为基准点进行一趟排序后序列为5 3 5 7 8 12 // 然后分别再对(5 3 5)(8 12)递归,进行快速排序。 其中的难点在于,如何实现以7为中心点,将序列再分为两段。下面介绍使用“两段交换”法来实现分块: ...
阅读全文
摘要:快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。 总的说来,要直接默写出快...
阅读全文
摘要:qsort :功 能: 使用快速排序例程进行排序 用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *)); 各参数:1 待排序数组首地址 2 数组中...
阅读全文
摘要:在二维平面上的n个点中,如何快速的找出最近的一对点,就是最近点对问题。 一种简单的想法是暴力枚举每两个点,记录最小距离,显然,时间复杂度为O(n^2)。 在这里介绍一种时间复杂度为O(nlognlogn)的算法。其实,这里用到了分治的 思想。将所给平面上n...
阅读全文