摘要:
1、交换 A 和 B// 1.中间变量void swap1(int a, int b) { int temp = a; a = b; b = temp;}// 2.加法void swap2(int a, int b) { a = a + b; b = a - b; a = a - b; }// 3.异或(相同为0,不同为1)void swap3(int a, int b)... 阅读全文
摘要:
一、问题描述有一座高度是10 级台阶的楼梯,从下往上走,每跨一步只能向上1 级或者2 级台阶。要求用程序来求出一共有多少种走法。二、算法分析从简单的分析,要到第 10 级台阶,有多少种方法?要么从 9 级跨 1 级,要么从 8 级跨 1 级。记 10 级台阶的状态为 f(10),9 级台阶的状态为 f(9),8 级台阶的状态为 f(8),那么 f(10) = f(9) + f(8)。f(9)... 阅读全文
摘要:
一、冒泡排序1.1 简介冒泡排序是蛮力法在排序问题上的一个典型的应用场景。对于一个给定长度为 n 的无序数组,由初始位置开始,比较数组相邻两个元素。如果是逆序排列的,就交换它们的位置,重复多次之后,最大数就“沉”到了数组最后的位置。第二次再从初始位置开始,将第二大的元素沉到倒数第二个位置。这样一直做 n-1 次,整个数组就是有序的了。对于一个长度为 n 的数组,整个算法消耗的时间为:(n-1) +... 阅读全文
摘要:
一、问题描述在一个 2k * 2k(k ≥ 0)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为特殊方格,显然,特殊方格在棋盘中出现的位置有 4k 种情形,因而有 4k 种不同的棋盘。二、算分分析用分治策略。当 k > 0 时,将 2k * 2k 棋盘分割成 4 个2k-1 * 2k-1子棋盘,特殊方格必定只位于某个子棋盘中。用一个 L 型骨牌覆盖 3 个无特殊方格子棋盘的结合处... 阅读全文
摘要:
#includeusing namespace std;void swap_t(int a[],int i,int j){ int t=a[i]; a[i]=a[j]; a[j]=t;}int par(int a[],int p,int q)//p是轴,轴前面是比a[p]小的,后面是比a[p]大的{ int i=p,x=a[p]; for(int j=p+1;j=x)... 阅读全文
摘要:
一、问题描述有 n 个数或字符,有多少种排列方法。二、算法分析采用分治法把大问题分解成很多的子问题。大问题是所有的排列方法,分解得到的小问题就是以 1 开头的排列,以 2 开头的排列,以 a 开头的排列,以 b 开头的排列...把这些问题继续分解,以 12 开头的排列,以 123 开头的排列...将余下的看成大问题,一直分解下去,直到分解成的子问题只有一个数字或字符的时候,不再分解。因为 1 个数... 阅读全文
摘要:
一、分治 1.1 基本思想 将一个难以直接解决的大问题,分割成 n 个规模较小的子问题,这些子问题相互独立,且与原问题相同,然后各个击破,分而治之。 能用分治法的基本特征: 问题缩小到一定规模容易解决 分解成的子问题是相同种类的子问题,即该问题具有最优子结构性质(递归思想) 分解而成的小问题在解决之 阅读全文
摘要:
一、问题描述有 5 座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人数也不同。参与挖矿工人的总数是 10 人。每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿。要求用程序求解出,要想得到尽可能多的黄金,应该选择挖取哪几座金矿?二、算法分析w 表示总共人数,n 表示金矿数,排列组合每一座金矿都有挖与不挖两种选择,排列组合起来就有 2n 种选择。对所有可能性做遍历,剔除那些使用工人数超过 10... 阅读全文
摘要:
一、问题描述一个袋子里有若干硬币,其中一枚是假币,并且和假币和真币一模一样,目前只知道假币比真币轻一点。请问如何找到这枚假币?二、算法分析根据分治的策略,将硬币平分为两份(奇数个硬币取出中间的硬币后再平分),比较两边的重量之和的大小。左侧重,则假币在右半段,反之,假币在左半段(或者中间的假币),然后继续在有假币的半区查找,直到剩余两个硬币,比较大小后,返回假币的位置。时间复杂度:O(logn)。三... 阅读全文
摘要:
一、问题描述 设有 n = 2k 个运动员要进行网球循环赛。现在要设计一个满足以下要求的比赛日程表 每个选手必须与其他 n 1 个选手各赛一场 每个选手一天只能比赛一场 循环赛一共进行 n 1 天 二、算法分析 按此要求可将比赛日程表设计成 n 行 n 1 列的表,在表中第 i 行和第 j 列处填入 阅读全文