Divide and Conquer(卜东波计算机算法作业题1)

合集下载

2.分治法

2.分治法

计算机学院
甘靖
2014-5-21
- 计算机算法基础 -
二次取中间值
计算机学院
甘靖
2014-5-21
- 计算机算法基础 -
算法时间复杂度分析
最坏情况下
T(n)cn if n24
T(n)T(n/5)+T(3n/4)+cn T(n) 20cn
计算机学院
甘靖
2014-5-21
- 计算机算法基础 -
summary
Divide-and-Conquer
A problem’s instance is divided into several smaller instances of the same problem, ideally of about the same size. The smaller instances are solved. If necessary, the solutions obtained for the smaller instances are combined to get a solution to the original problem.
计算机学院
甘靖
2014-5-21
- 计算机算法基础 -
五、 选择问题
方案一: 先用排序算法排序,然后输出第k个元素 算法复杂度O(nlog2n) 要排序整个l-5-21
- 计算机算法基础 -
方案二: 不必排序整个list,只需排序包含kth最小元的子集
A[j] A[j]
平均情况下(和下面递归式有相同的复杂度)
T(n)=T(n/2)+(n+1) T(n)=(n)
计算机学院
甘靖
2014-5-21

算法分析第五次作业答案(卜东波)

算法分析第五次作业答案(卜东波)

算法第五次作业答案第1题:答:TURE法一:我们已知用Kruskal算法能够生成G的一棵最小生成树,而在此算法运行时最小费用边e*将被首先添加进来,从而可知最后生成的最小生成树肯定包含边e*法二:假设边e*(代价最少的边)的两个顶点为v1和v2,图G中共有N 个点,为v1、v2、…v N。

现在假设已经找出了除v1外的点全部被纳入的最优生成树,现在只要将v1以最小代价连入即可,由于e*是v1连接的代价最少的边(v1连接的其余边要付出的代价都比e*大),所以一定会选择e*连入以生成最小生成树。

第2题:答:1) 算法如下:While 图G中还有环用BFS算法遍历图G,找到一个环后删除环中费用最大的边;返回删除了一条边后的图G;Endwhile消除了所有的环后最后剩下的图G即为最小生成树2) 算法正确性证明:使用BFS广度搜索遍历整个图,找到环后删除环中代价最大的边,之后重新遍历,每遍历一次消除一个环,最后留下的图中没有环,并且剩下的边都是相对代价小的,因此生成的是最小生成树。

3) 复杂度:因为最多不超过n+8个边,所以环至多只有9个,所以整个BFS 遍历最多不超过9次,而BFS 算法复杂度为O(V+E)=O(n),故总的复杂度是O(n).第3题:(1)算法描述如下:①初始化一个具有n 个顶点0条边的图G②对给定的度数序列0L 进行排序得11212{,,,}d n n L d d d d d =≥≥≥……且…… ③1L 中前n d 个数均减1并舍去最后一个数得21211L {1,1,,1,,,}n n d d n d d d d d +-=---…………④在进行第③步处理的同时对图G 中的顶点进行连线并用2L 替换0L ; ⑤重复步骤②—④直到0L 为空,此时得到的图G 即为所求(2)算法正确性证明:①如果图G 具有n-1个顶点且度数序列为2L ,在图G 中添加一个顶点n v ,使得n v 与顶点12,,,nd v v v ……相连,得到图'G 且其度数序列为1L 。

POJ+练习题分类

POJ+练习题分类

POJ+练习题分类POJ 练习题分类目录1.基本输入输出 (1)2.算术逻辑运算 (1)3.循环 (2)4.数组 (3)5.指针 (3)6.排序 (3)7.函数 (3)8.简单计算题 (3)9.进制转换 (4)10.字符串处理 (4)11.时间和日期处理 (5)12.模拟 (5)13.高精度计算 (6)14.枚举 (6)15.递归 (7)16.动态规划 (7)1. 1.基本输入输出1.1 第一个Java程序27282. 2.算术逻辑运算2.1 计算书费26752.2 化验诊断26802.3 最远距离26932.4 最大商26952.5 与7无关的数27012.6 骑车与走路27032.7 跳绳游戏27052.8 求一元二次方程的根2707 2.9 平衡饮食27082.10 细菌繁殖27122.11 求平均年龄27142.12 谁拿了最多奖学金2715 2.13 晶晶赴约会27182.14 陶陶摘苹果27192.15 大象喝水27202.16 学分绩点27222.17 生日相同27242.18 求12以内n的阶乘2729 2.19 鸡兔同笼27502.20 二叉树27562.21 数根27642.22 二叉树27882.23 计算图像方差27892.24 数字求和27962.25 点和正方形的关系2854 2.26 计算邮资28562.27 停车场收费29332.28 试剂配制29362.29 验证“歌德巴赫猜想”31433. 3.循环3.1 整数的个数26763.2 整数的立方和26793.3 求分数序列和26833.4 求阶乘的和26843.5 打印水仙花数26853.6 打印完数26863.7 迭代法解方程26973.8 自整除数26993.9 求出e的值27092732 3.11 菲波那契数列27533.12 牛顿迭代方法28683.13 计算费马数28693.14 能被3除尽的数之和2886 3.15 能被3,5,7整除的数2887 3.16 受限完全平方数2911 3.17 三个完全平方数2912 3.18 求和29403.19 满足条件的整数29413.20 球弹跳高度的计算31424. 4.数组4.1 肿瘤检测26774.2 数组逆序重放26874.3 打印极值点下标26914.4 肿瘤面积27134.5 求矩阵的加法28704.6 异常细胞检测29375. 5.指针5.1 求字符串长度26815.2 循环移动26826. 6.排序6.1 整数奇偶排序28716.2 按顺序输出29386.3 小白鼠排队29436.4 摘花生29507. 7.函数7.1 计算反序数28857.2 矩阵交换行28997.3 字符串排序29157.4 素数回文数的个数29288. 8.简单计算题8.1 装箱问题10178.2 棋盘上的距离16578.3 化验诊断26808.4 平均年龄27148.5 谁拿了最多的奖学金2715 8.6 鸡兔同笼27508.7 简单密码27678.8 数字求和27968.9 垂直直方图28008.10 填词28018.11 两倍28078.12 校门外的树28088.13 密码28189. 9.进制转换9.1 数制转换27109.2 十进制到八进制27349.3 八进制到十进制27359.4 八进制小数27659.5 2进制转化为16进制2798 9.6 确定进制29729.7 skew数297310. 10.字符串处理10.1 统计字符数267810.2 求字母的个数2688 10.3 大小写字母互换2689 10.4 首字母大写269010.5 计算表达式的值269610.6 字符替换270010.7 密码翻译270210.8 竞赛评分270410.9 统计字符数274210.10 字符串判等274310.11 子串274410.12 字符串数组排序问题2752 10.13 简单密码276710.14 最短前缀279710.15 浮点数格式279910.16 词典280410.17 W密码281910.18 古代密码282010.19 句中最长的单词2880 10.20 字符串中的数字2888 10.21 字符串加空格2909 10.22 提取数字291010.23 加密技术291310.24 算术运算292610.25 判断数字个数2927 10.26 扩号匹配292910.27 加减乘除293010.28 比较数字个数2931 10.29 字符串插入293410.30 有未知数的表达式2935 10.31 单词替换294410.32 487-3279 297410.33 Caesar密码297510.34 All in All 297610.35 日志排序299811. 11.时间和日期处理11.1 细菌繁殖271211.2 不吉利的日期2723 11.3 判断闰年273311.4 日历问题296411.5 玛雅历296511.6 时区间时间的转换296611.7 特殊日历计算296712. 12.模拟12.1 排列183312.2 宇航员183512.3 显示器274512.4 约瑟夫问题274612.5 数根276412.6 武林278512.7 垂直直方图280012.8 玩游戏294612.9 花生问题295012.10 循环数295213. 13.高精度计算13.1 麦森数270613.2 求20以内n的阶乘2730 13.3 求10000以内n的阶乘273113.4 大整数减法273613.5 大整数除法273713.6 浮点数加法273813.7 计算对数273913.8 八进制小数276513.9 孙子问题浮点数加法279313.10 计算2的N次方2809 13.11 大整数的因子2925 13.12 浮点数求高精度幂2951 13.13 大整数乘法298013.14 大整数加法298114. 14.枚举14.1 反正切函数的应用1183 14.2 称硬币269214.3 计算对数273914.4 数字方格274714.5 正方形280514.6 完美立方281014.7 熄灯问题281114.8 讨厌的青蛙281214.9 画家问题281314.10 拨钟问题281414.11 生理周期297715. 15.递归15.1 棋盘分割119115.2 棋盘问题132115.3 放苹果166415.4 逆波兰表达式2694 15.5 八皇后问题269815.6 合唱队形271115.7 采药272615.8 数字方格274715.9 全排列274815.10 分解因数274915.11 菲波那契数列2753 15.12 八皇后问题275415.13 二叉树275615.14 文件结构"图"2775 15.15 算24278715.16 迷宫279015.17 小游戏280215.18 碎纸机280315.19 城堡281515.20 红与黑281615.21 木棍问题281716. 16.动态规划16.1 滑雪108816.2 帮助Jimmy 1661 16.3 还是采药问题2727 16.4 采药273316.5 神奇的口袋2755 16.6 最长上升子序列2757 16.7 菲波那契数列(2) 2758 16.8 神奇的口袋(2) 2759 16.9 数字三角形2760 16.10 最大子矩阵2766 16.11 采药277316.12 木材加工2774 16.13 文件结构“图”2775 16.14 Pell 数列2786 16.15 矩形覆盖2791 16.16 集合加法2792 16.17 孙子问题2793 16.18 金银岛279516.19 最长公共子序列2806 16.20 矩形覆盖280916.21 陪审团的人选2979。

算法分析第三次作业答案(卜东波)

算法分析第三次作业答案(卜东波)

算法第三次作业答案第1题:答:令A 、B 为已给两个数据库的数据集,其中A(i)、B(i)为A 、B 中第i 个最小的值,给出求中值算法如下:Median(n,a,b)If n=1 then return min(A(a+k),B(b+k))12k n ⎡⎤=⎢⎥⎢⎥Query A(a+k)和B(b+k)If A(a+k)<B(b+k)return Median(k,a+k,b)Else return Median(k,a,b+k)要找出A 、B 中值调用Median(n,0,0),令该算法复杂度为Q(n),则: Q(n) ≤ Q(n/2)+2推出Q(n)= O(log n)第2题:答:令序列a 1,a 2,…,a n 排好序后为b 1,b 2,…,b n ,要求重要逆序对的数目,设计算法如下:1) Sort-and-Count (L)If n=1 then 没有逆序对Else k=n/2,将L 分成两个自序列A 和B;(N 1,A) = Sort-and-Count(A);(N 2,B) = Sort-and-Count(B);(N 3,L) = Merge-and-Count(A,B);return N= N 1+ N 2+ N 3和排好序的表L2)Merge-and-Count(A,l,m,r)令A[l…m]为L,A[m+1…r]为Ri = 1,j = 1, InversionCount =0for k = m to r doif L[i] > R[j] thenA[k] = L[i]i++;if L[i] > 3R[j] thenInversionCount = InversionCount + j - kelseA[k] = R[j]j++end for显然Merge-and-Count (A,B)的算法复杂度为cn 令Sort-and-Count (L)的算法复杂度为T(n),则:T(n)≤2T(n/2)+cn可推出T(n)=O(n log n)第3题:(1)算法如下:Find-Local-Min(T)If T has childrenLet L and R be T’s childre nProbe the values of XL , XR, XT;If XL < XTReturn Find-Local-Min(L)Else If XR < XTReturn Find-Local-Min(R)ElseReturn T(2)复杂度分析:因n=2d-1,则完全二叉树的深度可表示为log(n+1),上述算法是沿着树的节点逐层递归的,即算法的最深递归层次为树深(log(n+1)),每层节的要进行三次试探,故总的试探次数为3* log(n+1),即算法的复杂度为O(3* log(n+1))=O(log(n))。

卜东波算法课

卜东波算法课

Every time when we visit a point, the dif is either increased by 1 or decreased by 1. Thus, the dif after every visit is a consecutive integer. Since it begins as 0, and when we visit the last Ghost(we have visit n Ghosts, and less than n − 1 Ghostbusters), we have dif ≤ −1. There must exist a time when we visit a Ghost and the dif becomes −1 for the first time. (It must be a Ghost, because the dif is deceased by 1 when we visit a Ghost. If it’s a Ghostbuster and the dif is −1, the dif before visiting this Ghostbuster must be −2. Since the dif is consecutive, the dif has become −1 before.) If we draw a line passing through the bottom, left-most Ghostbuster and the current Ghost, the number of Ghostbusters on one side of the line equals the number of Ghosts on the same side.(The dif is −1 because it takes the current Ghost into account. Thus the number of Ghostbusters should equals the number of Ghosts when eliminate the current Ghost.) 1.1.3 Analysis

divide逻辑

divide逻辑

divide逻辑摘要:1.介绍divide 逻辑的基本概念2.divide 逻辑在编程中的应用3.divide 逻辑在实际生活中的应用案例4.divide 逻辑的优势与局限性5.总结与展望正文:divide 逻辑是一种基本的逻辑运算,它在计算机科学和编程领域有着广泛的应用。

divide 逻辑的基本概念是将一个较大的数(被除数)分成若干个相等的部分(除数),从而得到一个商。

在编程中,divide 逻辑通常用于实现算术运算、数值计算等功能。

在编程中,divide 逻辑有很多实际应用。

例如,在Python 编程语言中,可以使用divide 逻辑实现一个简单的除法计算器。

具体代码如下:```pythondef calculator(a, b):return a / b```在这个例子中,divide 逻辑用于计算a 除以b 的结果。

当然,divide 逻辑在编程中的应用远不止于此。

在许多算法和数据结构中,divide 逻辑都发挥着关键作用。

除了在编程中的应用,divide 逻辑在实际生活中也有很多有趣的应用案例。

例如,在餐饮行业,divide 逻辑可以用于计算食材的份量。

假设一个厨师需要为一个八人份的披萨准备食材,那么他需要将总食材量除以8,以得到每个人份的食材量。

当然,divide 逻辑也有其优势和局限性。

优势在于,divide 逻辑是一种非常基本的逻辑运算,易于理解和实现。

同时,divide 逻辑在许多实际问题中都能发挥作用,例如上述的披萨食材计算。

然而,divide 逻辑的局限性在于,它只能用于计算整数除法,对于浮点数或其他类型的数据,可能需要采用其他方法。

总之,divide 逻辑作为一种基本的逻辑运算,在编程和实际生活中都有着广泛的应用。

Divide and Conquer

Divide and Conquer

Divide and Conquer当输入数据的规模很小时,比如只有一个或两个数字,则绝大多数的问题都很容易解。

可是当输入规模增大时,问题往往变得很难。

因此,算法设计的一个基本方法就是寻找大规模问题解与小规摸问题解之间的关系。

分治术(Divide and Conquer)是这种方法之一。

后面要讲的贪心法和动态规划也是基于这种方法但技巧上有不同之处。

简单地说,分治术的做法是将一个规模为n的问题分解为整数个规模小些的子问题,然后找出这些子问题或者一部分子问题的解并由此得到原问题的解。

在解决这些子问题时,分治术要求用同样的方法递归解出。

那就是说,我们必须把这些子问题再分为更小的问题直至问题的规模小到可以直接解出。

这个不断分解的过程看起来很复杂,但用递归的算法表达出来却往往简洁明了。

通常,在用分治术的算法中只要讲明三件事:(1)底(bottom case):对足够小的输入规模,如何直接解出。

(2)分(divide):如何将一个规模为n的输入分为整数个规模小些的子问题。

(3)合(conquer) :如何从子问题的解中获得原规模为n的解。

下面我们看一个例子。

1第一个例子−二元搜索假定有一个已排好序的数组A[1] ≤A[2] ≤…≤A[n]。

现在我们要在这n个数字中查找是否有一个数等于要找的数x。

如果是A[i] = x, 则报告序号i,否则报告无(nil)。

我们可以用以下的算法。

输入:A[p], A[p+1], …, A[r], x输出: i如果A[i] = x否则nil。

BinarySearch (A, p, r, x);1. if p > r2. then return (nil)3. midpoint ←⎣(p+r)/2⎦4. if A[midpoint] = x5. then return (midpoint)6. else if x < A[midpoint]7. then BinarySearch (A, p, midpoint-1, x)8. else BinarySearch (A, midpoint+1, r, x)9. End注意,上面的算法只是一个子程序,要搜索数组A[1], A[2], …, A[n]时,主程序需要调用BinarySearch(A, 1, n, x)。

dividing 题解

dividing 题解

dividing 题解摘要:I.概述- 介绍divide and conquer 算法的基本思想- 说明divide and conquer 算法的应用场景和优势II.具体实现- 讲解divide and conquer 算法的基本步骤- 举例说明divide and conquer 算法的具体应用- 分析divide and conquer 算法的复杂度和时间效率III.示例代码- 给出divide and conquer 算法的Python 实现代码- 展示代码的运行过程和结果IV.总结- 总结divide and conquer 算法的重要性和应用价值- 提出divide and conquer 算法的未来发展前景正文:Divide and Conquer 算法是一种解决问题的策略,其基本思想是将一个大问题划分为若干个较小的子问题,然后逐个解决这些子问题,最后将子问题的解合并得到原问题的解。

这种算法应用于许多领域,包括计算机科学、运筹学、物理学等。

下面将从divide and conquer 算法的基本思想、具体实现、示例代码和总结等方面进行介绍。

一、概述Divide and Conquer 算法的基本思想是将一个大问题划分为若干个较小的子问题,然后分别解决这些子问题,最后将子问题的解合并得到原问题的解。

这种算法可以有效地降低问题的复杂度,提高解决问题的效率。

Divide and Conquer 算法的应用场景非常广泛,例如求解最大公约数、快速排序、归并排序、深度优先搜索等。

二、具体实现Divide and Conquer 算法的基本步骤如下:1.确定问题:明确需要解决的问题,并将其划分为若干个子问题。

2.递归处理:对于每个子问题,继续划分为更小的子问题,直到子问题规模足够小,可以被直接解决。

3.合并结果:将所有子问题的解合并得到原问题的解。

下面以快速排序为例,介绍divide and conquer 算法的具体应用。

求两个数的商练习题

求两个数的商练习题

求两个数的商练习题问题描述给定两个数a和b,求它们的商q。

输入- 数字a- 数字b输出- 两个数的商q示例输入:a = 10<br>b = 2输出:q = 5解决方案在解决这个问题之前,我们需要确保输入的数字a和b是合法的,并且b不等于0,因为除法中不能出现分母为0的情况。

我们可以在代码中加入条件来检查这些情况。

以下是一个求两个数的商的代码示例:def divide(a, b):if b != 0:q = a / breturn qelse:raise ValueError("除数不能为0")输入a = float(input("请输入第一个数字:"))b = float(input("请输入第二个数字:"))try:调用函数求商result = divide(a, b)print(f"两个数的商为:{result}")except ValueError as e:print(e)以上代码定义了一个`divide`函数,它接受两个参数a和b,并返回它们的商q。

在函数体中,我们先检查b是否为0,如果是,则抛出一个`ValueError`异常,否则执行除法运算。

在主程序中,我们先获取用户输入的a和b的值,然后调用`divide`函数来求解商,并将结果打印出来。

这个程序可以处理错误输入(如除数为0)的情况,并给出友好的错误提示。

你可以根据你的实际需求对上述代码进行修改和扩展。

希望以上内容能够帮助到你,如有任何问题,请随时提出。

分治法

分治法

第4章分治法(Divide and Conquer)1.合并排序和快速排序2.折半查找3.大整数乘法4.Strassen’s矩阵乘法5.最近对问题分治法在计算机科学中,分治法是一种很重要的算法。

字面上的解释是“分而治之”,其主要思想也推广到军事、政治和管理中将一个难以直接解决的大问题,划分成一些规模较小的子问题,以便各个击破,分而治之。

更一般地说,将要求解的原问题划分成k个较小规模的子问题,对这k个子问题分别求解。

如果子问题的规模仍然不够小,则再将每个子问题划分为k个规模更小的子问题,如此分解下去,直到问题规模足够小,很容易求出其解为止,再将子问题的解合并为一个更大规模的问题的解,自底向上逐步求出原问题的解。

2分治法的三个步骤一般来说,分治法的求解过程由以下三个阶段组成:(1)划分Divide :既然是分治,当然需要把规模为n的原问题划分为k个规模较小的子问题,并尽量使这k 个子问题的规模大致相同。

(2)求解子问题Conquer :各子问题的解法与原问题的解法通常是相同的,可以用递归的方法求解各个子问题,有时递归处理也可以用循环来实现。

(3)合并Combine:把各个子问题的解合并起来,合并的代价因情况不同有很大差异,分治算法的有效性很大程度上依赖于合并的实现。

34子问题1的规模是n /2子问题1的解子问题2的解子问题2的规模是n /2原问题的解原问题的规模是n分治技术(典型情况)5例:计算a n ,应用分治技术得到如下计算方法:3432328131319313193333分解问题求解每个子问题合并子问题的解不是所有的分治法都比简单的蛮力法更有效。

分析时间性能⎣⎦⎡⎤⎩⎨⎧>´==1122n aan aan nn如果如果6通用分治递推式问题规模为n 的实例被划分为b 个规模为n/b 的实例,其中a 个实例需要求解,假设n 是b 的幂T (n) = a T (n/b) + f (n)主定理:如果在递推式中f (n)∈Θ(n d ),其中d≥0log ()()(log )()b d d an T n n n n⎧Θ⎪∈Θ⎨⎪Θ⎩当a<b d 时当a=b d 时当a>b d 时结论对于其他符号O 、Ω同样成立1.T(n) = 4T(n/2) + n 2.T(n) = 4T(n/2) + n 23.T(n) = 4T(n/2) + n 34.1 合并排序合并排序的分治策略是:(1)划分:将待排序序列A[0..n-1]划分为两个长度相等的子序列A[0..n/2-1]和A[n/2..n-1] ;(2)求解子问题:分别对这两个子序列进行排序,得到两个有序子序列;(3)合并:将这两个有序子序列合并成一个有序序列。

DivideandConquer(卜东波计算机算法作业题2)

DivideandConquer(卜东波计算机算法作业题2)

DivideandConquer(卜东波计算机算法作业题2)Divide and ConquerConsider an n-node complete binary tree T, where n = 2d? 1 for some d.Each node v of T is labeled with a real number x v. You may assume thatthe real numbers labeling the nodes are all distinct. A node v of T is alocal minimum if the label x v is less than the label x w for all nodes w thatare joined to v by an edge.You are given such a complete binary tree T, but the labeling is onlyspecified in the following implicit way: for each node v, you can determinethe value x v by probing the node v. Show how to find a local minimum ofT using only O(logn) probes to the nodes of T.4.1算法思想找到根节点与根节点的两个孩子节点的值最小的,如何最小者恰好是根节点,那么就返回该节点,否则递归查找孩子中值较小的那一个对应的子树。

算法中,probe() 接受一个树的节点的输入,返回该节点的值。

4.2算法Local-Min-Probe(T,u)1 If u has no child2 return u3 Else4 L = left child of u5 R = right child of u6 If(u < L && u < R)7 return u8 Else9 V = min(l, r)10 Local-Min-Probe(T,v)4.3算法复杂度分析语句1-2为判断语句,时间复杂度为O(1),语句4-5为赋值语句,复杂度为O(1),语句6-7为判断语句,复杂度为O(1),语句9-10查找子树的复杂度为O(logn),故整个算法的复杂度为O (logn)。

-习题参考答案

-习题参考答案

-习题参考答案算法设计与分析基础习题1.15..证明等式gcd(m,n)=gcd(n,m mod n)对每⼀对正整数m,n都成⽴.Hint:根据除法的定义不难证明:●如果d整除u和v, 那么d⼀定能整除u±v;●如果d整除u,那么d也能够整除u的任何整数倍ku.对于任意⼀对正整数m,n,若d能整除m和n,那么d⼀定能整除n和r=m mod n=m-qn;显然,若d能整除n和r,也⼀定能整除m=r+qn和n。

数对(m,n)和(n,r)具有相同的公约数的有限⾮空集,其中也包括了最⼤公约数。

故gcd(m,n)=gcd(n,r)6.对于第⼀个数⼩于第⼆个数的⼀对数字,欧⼏⾥得算法将会如何处理?该算法在处理这种输⼊的过程中,上述情况最多会发⽣⼏次? Hint:对于任何形如0<=mgcd(m,n)=gcd(n,m)并且这种交换处理只发⽣⼀次.7.a.对于所有1≤m,n≤10的输⼊, Euclid算法最少要做⼏次除法?(1次)b. 对于所有1≤m,n≤10的输⼊, Euclid算法最多要做⼏次除法?(5次)gcd(5,8)习题1.21.(农夫过河)P—农夫W—狼G—⼭⽺C—⽩菜2.(过桥问题)1,2,5,10---分别代表4个⼈, f—⼿电筒4. 对于任意实系数a,b,c, 某个算法能求⽅程ax^2+bx+c=0的实根,写出上述算法的伪代码(可以假设sqrt(x)是求平⽅根的函数)算法Quadratic(a,b,c)//求⽅程ax^2+bx+c=0的实根的算法//输⼊:实系数a,b,c//输出:实根或者⽆解信息If a≠0D←b*b-4*a*cIf D>0temp←2*ax1←(-b+sqrt(D))/tempx2←(-b-sqrt(D))/tempreturn x1,x2else if D=0 return –b/(2*a)else return “no real roots”else //a=0if b≠0 return –c/belse //a=b=0if c=0 return “no real numbers”else return “no real roots”5.描述将⼗进制整数表达为⼆进制整数的标准算法a.⽤⽂字描述b.⽤伪代码描述解答:a.将⼗进制整数转换为⼆进制整数的算法输⼊:⼀个正整数n输出:正整数n相应的⼆进制数第⼀步:⽤n除以2,余数赋给Ki(i=0,1,2...),商赋给n第⼆步:如果n=0,则到第三步,否则重复第⼀步第三步:将Ki按照i从⾼到低的顺序输出b.伪代码算法DectoBin(n)//将⼗进制整数n转换为⼆进制整数的算法//输⼊:正整数n//输出:该正整数相应的⼆进制数,该数存放于数组Bin[1...n]中i=1while n!=0 do {Bin[i]=n%2;n=(int)n/2;i++;}while i!=0 do{print Bin[i];i--;}9.考虑下⾯这个算法,它求的是数组中⼤⼩相差最⼩的两个元素的差.(算法略) 对这个算法做尽可能多的改进.算法MinDistance(A[0..n-1])//输⼊:数组A[0..n-1]//输出:the smallest distance d between two of its elements习题1.31.考虑这样⼀个排序算法,该算法对于待排序的数组中的每⼀个元素,计算⽐它⼩的元素个数,然后利⽤这个信息,将各个元素放到有序数组的相应位置上去.a.应⽤该算法对列表‖60,35,81,98,14,47‖排序b.该算法稳定吗?c.该算法在位吗?解:a. 该算法对列表‖60,35,81,98,14,47‖排序的过程如下所⽰:b.该算法不稳定.⽐如对列表‖2,2*‖排序c.该算法不在位.额外空间for S and Count[]4.(古⽼的七桥问题)习题1.41.请分别描述⼀下应该如何实现下列对数组的操作,使得操作时间不依赖数组的长度. a.删除数组的第i 个元素(1<=i<=n) b.删除有序数组的第i 个元素(依然有序) hints:a. Replace the i th element with the last element and decrease the array size of 1b. Replace the ith element with a special symbol that cannot be a value of the array ’s element(e.g., 0 for an array of positive numbers ) to mark the i th position is empty. (―lazy deletion ‖) 第2章习题2.17.对下列断⾔进⾏证明:(如果是错误的,请举例) a. 如果t(n )∈O(g(n),则g(n)∈Ω(t(n)) b.α>0时,Θ(αg(n))= Θ(g(n)) 解:a. 这个断⾔是正确的。

od机试题 拔河比赛 python题解

od机试题 拔河比赛 python题解

od机试题拔河比赛python题解拔河比赛是一道经典的编程题,我们可以用Python来解决。

首先,我们需要知道比赛的规则。

假设有两个队伍A和B,每个队伍有若干人参加比赛。

比赛的胜负是根据两个队伍总力量的差值来判断的。

要解决这道题,我们需要编写一个函数来计算两个队伍总力量的差值。

```pythondef calculate_diff(team_a, team_b):total_a = sum(team_a) # 计算队伍A的总力量total_b = sum(team_b) # 计算队伍B的总力量return abs(total_a - total_b) # 返回两个总力量的差值的绝对值```接下来,我们需要编写一个函数来确定哪个队伍获胜。

```pythondef determine_winner(team_a, team_b):diff = calculate_diff(team_a, team_b) # 调用上面的函数计算总力量的差值if diff == 0: # 如果差值为0,表示两个队伍力量相等return "平局"elif diff < 0: # 如果差值小于0,表示队伍A的总力量超过队伍B的总力量return "A队获胜"else: # 如果差值大于0,表示队伍B的总力量超过队伍A的总力量return "B队获胜"```最后,我们可以调用上面的函数,传入队伍A和队伍B的力量列表来测试。

```pythonteam_a = [50, 60, 70] # 队伍A的力量列表team_b = [40, 55, 75] # 队伍B的力量列表result = determine_winner(team_a, team_b) # 调用函数确定胜负print(result) # 打印结果```以上就是一种解决拔河比赛的Python代码。

当然,在实际场景中可能会有更复杂的情况,比如不同队伍的人数不一样,或者队伍的力量值不是整数。

使用计算器的能力的奥数题及答案

使用计算器的能力的奥数题及答案

使用计算器的能力的奥数题及答案使用计算器的能力的奥数题及答案艾伦、贝蒂和卡罗想出一种游戏,来检验彼此使用计算器的能力。

这个游戏是要用最有效的方式,在计算机上依序得出1到20的整数。

这并不像听起来那么容易,因为他们规定,每次按下的数字必须依照大小次序,从1开始,而且不得重复。

例如按下3之后,下一次必须按4。

游戏进行到求8时,各人的按法如下:艾伦的按法是-1+2+3+4=贝蒂的按法是1×2×3=卡罗的按法是.1-2=在求得某个数字时,按键次数最少的人得分;如果按键次数一样,则输入数字最小的人得分。

以上面的.情形为例,艾伦按了9个键,贝蒂和卡罗则只接了6个键。

然而,卡罗只按了1和2两个数字,因此由他得到分数。

分析与解答:这个游戏鼓励学生去探索计算器所具有的功能。

例如,CASIO HL-807型计算器就有一种功能,在按下1+====之后,会得到4,也就是按下n个等号键就会得到n。

使用记忆键也能得到类似的答案,不过这并不一定是最有效的方式。

例如按下1之后会得到6,总共接了8次键。

但是按1+2+3=也会得到6,而只需按6次键。

或是按下1×2×3=或 1+2==(使用CASIO HL-807)或 1+2=都可以。

下面所列的是使用CASIO fx-8100计算器按出1到20的方法,但不一定是最好的答案!按键次数1:1 12:1×2 33:1+2= 44:1×2×= 55:.1÷2= 66:1×2×3= 67:1+2×3= 68:.1-2= 69:1+2=×= 610:.1 311:1-2+3×4= 812:.1+2= 613:1+2 3+4= 814:1×2+3×4= 815:.1÷2×3= 816:1×2×=×= 717:.1×2-3= 818:1+2=×= 919:1×2×=×=+3= 1020:.1×2= 6。

第一届计算大赛初赛-2年级

第一届计算大赛初赛-2年级

第一届计算大赛初赛-2年级1、9×8= [填空题] *_________________________________(答案:72)2、56+35= [填空题] *_________________________________(答案:91)3、66-61= [填空题] *_________________________________(答案:5)4、59-20= [填空题] *_________________________________(答案:39)5、89-76= [填空题] *_________________________________(答案:13)6、27+1= [填空题] *_________________________________(答案:28)7、18+1= [填空题] *_________________________________(答案:19)8、2×8= [填空题] *_________________________________(答案:16)9、8×4= [填空题] *_________________________________(答案:32)10、7×6= [填空题] *_________________________________(答案:42)_________________________________(答案:64) 12、7×5= [填空题] *_________________________________(答案:35) 13、71+26= [填空题] *_________________________________(答案:97) 14、22-6= [填空题] *_________________________________(答案:16) 15、48÷8= [填空题] *_________________________________(答案:6) 16、6+31= [填空题] *_________________________________(答案:37) 17、4×2= [填空题] *_________________________________(答案:8) 18、54+16= [填空题] *_________________________________(答案:70) 19、2×4= [填空题] *_________________________________(答案:8) 20、2÷2= [填空题] *_________________________________(答案:1) 21、26-11= [填空题] *_________________________________(答案:15) 22、9÷1= [填空题] *_________________________________(答案:9)_________________________________(答案:19) 24、33-16= [填空题] *_________________________________(答案:17) 25、2×9= [填空题] *_________________________________(答案:18) 26、89-43= [填空题] *_________________________________(答案:46) 27、32+6= [填空题] *_________________________________(答案:38) 28、55-33= [填空题] *_________________________________(答案:22) 29、16÷8= [填空题] *_________________________________(答案:2) 30、8×8= [填空题] *_________________________________(答案:64) 31、1×9= [填空题] *_________________________________(答案:9) 32、51+3= [填空题] *_________________________________(答案:54) 33、4×1= [填空题] *_________________________________(答案:4) 34、87-86= [填空题] *_________________________________(答案:1)_________________________________(答案:16) 36、20+27= [填空题] *_________________________________(答案:47) 37、42-28= [填空题] *_________________________________(答案:14) 38、19+1= [填空题] *_________________________________(答案:20) 39、75-58= [填空题] *_________________________________(答案:17) 40、20÷5= [填空题] *_________________________________(答案:4) 41、55+14= [填空题] *_________________________________(答案:69) 42、26+48= [填空题] *_________________________________(答案:74) 43、9×3= [填空题] *_________________________________(答案:27) 44、10÷2= [填空题] *_________________________________(答案:5) 45、54÷6= [填空题] *_________________________________(答案:9) 46、50-35= [填空题] *_________________________________(答案:15)_________________________________(答案:10) 48、16÷2= [填空题] *_________________________________(答案:8) 49、55+16= [填空题] *_________________________________(答案:71) 50、4+45= [填空题] *_________________________________(答案:49) 51、18÷3= [填空题] *_________________________________(答案:6) 52、29-17+5= [填空题] *_________________________________(答案:17) 53、37+22= [填空题] *_________________________________(答案:59) 54、54+46= [填空题] *_________________________________(答案:100) 55、120+37= [填空题] *_________________________________(答案:157) 56、4×9= [填空题] *_________________________________(答案:36) 57、100-41= [填空题] *_________________________________(答案:59) 58、8×4= [填空题] *_________________________________(答案:32)_________________________________(答案:133) 60、98-25= [填空题] *_________________________________(答案:73) 61、236+47= [填空题] *_________________________________(答案:283) 62、146+254= [填空题] *_________________________________(答案:400) 63、243-129= [填空题] *_________________________________(答案:114) 64、91-63= [填空题] *_________________________________(答案:28) 65、321-21= [填空题] *_________________________________(答案:300) 66、1×1= [填空题] *_________________________________(答案:1) 67、27-9= [填空题] *_________________________________(答案:18) 68、480-317= [填空题] *_________________________________(答案:163) 69、17+37= [填空题] *_________________________________(答案:54) 70、42÷6= [填空题] *_________________________________(答案:7)_________________________________(答案:7) 72、54÷9= [填空题] *_________________________________(答案:6) 73、15÷5= [填空题] *_________________________________(答案:3) 74、24÷3= [填空题] *_________________________________(答案:8) 75、24÷6= [填空题] *_________________________________(答案:4) 76、32÷8= [填空题] *_________________________________(答案:4) 77、25÷5= [填空题] *_________________________________(答案:5) 78、18÷6= [填空题] *_________________________________(答案:3) 79、12÷2= [填空题] *_________________________________(答案:6) 80、27÷9= [填空题] *_________________________________(答案:3) 81、66 +37- 41= [填空题] *_________________________________(答案:62) 82、34+24-49= [填空题] *_________________________________(答案:9)83、87-36-34= [填空题] *_________________________________(答案:17) 84、27+47+19= [填空题] *_________________________________(答案:93) 85、34+42+27= [填空题] *_________________________________(答案:103) 86、15+47- 41= [填空题] *_________________________________(答案:21) 87、355-126-74= [填空题] *_________________________________(答案:155) 88、309-88-109= [填空题] *_________________________________(答案:112) 89、21+23= [填空题] *_________________________________(答案:44) 90、53-23= [填空题] *_________________________________(答案:30) 91、5×6= [填空题] *_________________________________(答案:30) 92、21÷3= [填空题] *_________________________________(答案:7) 93、8×2= [填空题] *_________________________________(答案:16) 94、27+23= [填空题] *_________________________________(答案:50)95、76-56= [填空题] *_________________________________(答案:20) 96、10×1= [填空题] *_________________________________(答案:10) 97、12÷3= [填空题] *_________________________________(答案:4) 98、20÷4= [填空题] *_________________________________(答案:5) 99、18÷2= [填空题] *_________________________________(答案:9) 100、42÷6= [填空题] *_________________________________(答案:7)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Divide and Conquer
Recall the problem of finding the number of inversions. As in the course, we are given a sequence of n numbers a1, ... , a n, which we assume are all distinct, and we define an inversion to be a pair i< j such that a i>a j.
We motivated the problem of counting inversions as a good measure of how different two orderings are. However, one might feel that this measure is too sensitive. Let’s call a pair a significant inversion if i< j and a i> 3a j. Given an O(nlogn) algorithm to count the number of significant inversions between two orderings.
解:
3.1算法思想
采用分治法和归并排序思想,不停地将序列A分割为两个等长的子序列L 和R,分别对L和R中的significant inversions进行计数,然后对L和R组成的总序列A中所有的significant inversions进行合并计数。

A中的总计数为L和R 中的分别计数,加上由于L和R合并而引入的新计数。

当序列只有两个数的时候,就是递归的终止条件。

3.2算法
Sort-and-Count (A)
1: Divide A into two sub-sequence L and R;
2: (RC L, L) = Sort-and-Count (L);
3: (RC R, R) = Sort-and-Count (R);
4: (r, A) = Merge-and-Count (L, R);
5: return (RC = RC L + RC R + r, A);
Merge-and-Count (L, R)
1: InverseCount = 0;
2: i = 1; j = 1;
3: for k = 1 to r do
4: if L[i] > R[j] then
5: A[k] = L[j];
6: j + +;
7: else
8: A[k] = R[i];
9: i + +;
10: end if
11:end for
12:i = 1; j = 1;
13:for k = Ltor do
14: if L[i] > 3R[j] then
15: InverseCount+ = length(L) -i + 1;
16: + + j;
17: else
18: + + i;
19: end if
20:end for
21: return InverseCount and A;
3.3正确性证明:
For every i, we count the number of significant inversions betweena i and all a j’s. If a i<=3 a j, then there are no significant inversions between a j and any a m s.t. m>=j, so we decrease j. If a i>3a j, then a i>3a m for all m s.t. k<m<=j. In other words, we have detected j-k significant inversions involving a i.
3.4算法复杂度分析:
Merge-and-count中的每个for循环都最多执行n次,故Merge-and-count的时间复杂度为O(n),根据二分算法的特性,最多分割logn次,也就是Merge-and-count最多执行logn次,故本算法的总复杂度为O(nlogn)。

相关文档
最新文档