算法导论-一个关于二分法的算法问题

问题描述

一个关于二分法的算法问题

一个建筑有n层,有k个学生,我们想用学生往下跳的方式寻找所谓的“致命楼层e”,也就说挑一个学生从这一层(e)向下跳会死人。有个函数jump(i)可以判断第i层是否致命,返回true是致命,false是不致命。假设jump(1)是false,saut(n)是true。一个学生可以重复利用。目的是使跳的次数最小化。
(1)如果 k = 1,怎样寻找一个算法?跳的次数的最坏情况是?
(2)如果k ≥logn(以2为底),设计一个算法,使得最坏情况是o(log(n))次
(3)如果k<logn(以2为底),设计一个算法,使得最坏情况是o(k + n/2^(k-1))
(4)如果k = 2,设计一个算法使得o(n的平方根)。

解决方案

没有理解你的问题。既然一个学生可以重复利用,那么要k个学生干嘛?

解决方案二:

第一问只能从一楼开始一楼一楼的跳,最坏情况是O(n)

解决方案三:

没有理解你的问题。。。你是要设计一个问题吗?

解决方案四:

楼主的意思应该是每个学生可以重复从1楼调到n楼 测试k个学生的跳楼情况 总结出哪一层是死亡人数最多的吧

解决方案五:

题目表意不明,就像上面所说的,楼主所说的“致命楼层e”是只一个人的数据就可,还是多个参照数据,而且问题所问的都是最
坏的情况,也就是跳的最多次数k*e或是e

时间: 2024-12-30 22:55:11

算法导论-一个关于二分法的算法问题的相关文章

算法导论-看到好几个Bellman-Ford算法都是这样写的,我有个疑问

问题描述 看到好几个Bellman-Ford算法都是这样写的,我有个疑问 for(int i = 1; i <= nodenum - 1; ++i) for(int j = 1; j <= edgenum; ++j) if(dis[edge[j].v] > dis[edge[j].u] + edge[j].cost) //松弛(顺序不能错) { dis[edge[j].v] = dis[edge[j].u] + edge[j].cost; pre[edge[j].v] = edge[j]

【算法导论】排序 (二):堆排序

四.(1)堆排序 第一次听堆排序是在107lab听忠哥讲的,但是没讲怎么实现.那时刚看了数据结 构的二叉树,还以为要通过指针建立二叉树的方式来实现,觉得挺难的. 其实堆排序实现没有想象中 的那么难. "堆"这个词最初是在堆排序中提出来的,但后来就逐渐指"废料收集储存区",就像程 序设计语言Lisp和Java中所提供的设施那样.我们这里的堆数据结构不是废料收集存储区. 堆排序的 运行时间与归并排序一样为O(n lg n),  但是一种原地(in place)排序. (

【算法导论】排序(一)

虽然久闻大名,但第一次接触算法导论,是看了网易公开课MIT的<算法导论>课,记得 第一集就讲到了 插入排序和归并排序. 几个星期前也买了算法导论这本书,准备慢慢啃~ 这星期主要在看前两 部分,除了对于讲渐进时间.递归式分析这些东西感到云里雾里的,其它的都就 感觉越看越有觉得入 迷,果然不愧是一本经典之作 好吧,开始.本文主要是用C++把书中的算法实现,以及一些笔记. 一.插入排序. 插入算法的设计使用的是增量(incremental)方法:在排好子数组A[1..j- 1]后,将 元素A[ j]

Java实现二分法查找算法

[ 什么是二分查找 ] 二分查找又称为折半查找,该算法的思想是将数列按序排列,采用跳跃式方法进行查找,即先以有序数列的中点位置为比较对象, 如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分.以此类推不断缩小搜索范围. [ 二分查找的条件 ] 二分查找的先决条件是查找的数列必须是有序的. [ 二分查找的优缺点 ] 优点:比较次数少,查找速度快,平均性能好: 缺点:要求待查数列为有序,且插入删除困难: 适用场景:不经常变动而查找频繁的有序列表. [ 算法步骤描述 ] ① 首

求问算法导论中一个非常简单的对数问题

问题描述 求问算法导论中一个非常简单的对数问题 求问算法导论中一个非常简单的对数问题.额,各位不要笑话啊. 请问这两个对数是如何推出相等的啊,用的是哪个公式啊? 只记得这个公式了.... 解决方案 解决方案二: begin{align} ln(3^{log_4^n}) & = ln(n^{log_4^3}) log_4^ncdot ln(3) & = log_4^3cdot ln(n) frac{ln(n)}{ln(4)}cdot ln(3) & = frac{ln(3)}{ln(

C++编程:C++归并排序实现(算法导论)

  算法导论上的下标是从1开始的,但是为了和c++ STL的设计思想一致,所有函数的实现统一用左闭右开区间.中间修改了很多次,因为下标修改不是很容易就改掉的,需要始终维持循环不变式,稍微一个步骤出错就会使结果有些错误. #include #include #include #include using namespace std; void merge(int *A, int p, int q, int r) { //merge [p, r),左闭右开区间 int n1 = q - p, n2

看算法导论有感(1)——谈谈算法的五性对用户体验的影响

做程序的人,都知道了算法的5性--可行性,健壮性,有穷性,高效性,可读性. 这15个字谁都会说了,但是,你是否真正的思考过这个对当今程序界最最重要的用户体验的思考. 过去,我也没多做思考,但是,看了mit的算法导论公开课,我却是觉得一个好的算法, 确实严格遵从算法算法五性. ①可行性--算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成.算法肯定要可行的,不可行的话,是一坨shit,一般可行性是与硬件息息相关.比如,10年前,你要先像现在的搜索引擎一样能够做视搜索,做各种各样的算法

c-关于二分法的算法问题

问题描述 关于二分法的算法问题 谁能帮我看看我这个是什么问题,为什么运行之后崩溃,而且警告说的是什么意思? # include<stdio.h> int erfen(int x , int v[], int n ){ int low = 0 ; int high = n - 1 ; int mid ; while( low <= high){ mid = ( low + high) / 2 ; if(x > v[mid]) low = mid + 1 ; else if( x &l

高效算法的常用技术(算法导论)

对于高效算法, 有些比较简单的技术, 如分治法, 随机化, 和递归求解技术. 这边介绍些更为复杂的技术, 动态规划, 贪心算法 当对于复杂问题设计算法时, 首先会想到使用分治法 来解决, 分而治之, 一个很有哲理性的思路, 再复杂的问题都可以不断分解到你可以轻松解决的粒度, 把所有简单问题都解决完后, 组合在一起就得到了复杂问题的解, 可以看出其中典型的递归求解的思路. 使用分治法的要求, 各个子问题是独立 的 (即不包含公共的子子问题,子问题不重叠 ). 如果子问题重叠, 用分治法就比较低效,