两个超经典超难应用题1、有一幢100楼的大厦,两部手机,让你设计一种算法确切地知道这部手机在第几楼摔下会坏,算法要尽量优化.2、有三根棍子,第一根上面套着n个环,最大的一个在底下,其余

来源:学生作业帮助网 编辑:作业帮 时间:2024/11/17 23:49:27
两个超经典超难应用题1、有一幢100楼的大厦,两部手机,让你设计一种算法确切地知道这部手机在第几楼摔下会坏,算法要尽量优化.2、有三根棍子,第一根上面套着n个环,最大的一个在底下,其余
x}{S[WWQ2 FXI[55}3S5˙6NbqO]I 0 y# ؼA۠||9G+oީܴ\}c^>V#V1F: f/A3c{V \7д:iFLO+e;{dgWPHXsoZɪȘ䭥Cxm2[Fd`RW)CZ*_*Yn 8DCIB `^9Uk1„d03a@ xQEN0F^Vs>WU~M8`!fnR?ΧѢRP%p-|dfz[E*.p- {ΫTNE̾@+3:ȪSR5s)w.KͰ3=31_2_hSy^7kyZd0e/,c٤KNdw:q%RF xl9C-gs9υUg=pam8V@˄izMY>H^VxС`]!efV۴#&&TOLB~3eP֓VzT8*ݏP7RNȨl68gxQDAl(bn?_7^]!B:8c(Ṱ[Q&6}T3Vf-W!N%DLGBЙ9=f.<7gܭeja 7.?s bNǑ*1hؓ5;4ہRD2qՒ+0mQ lAbPDEͩYXZ3s(hu% Ec:q@"Eh T@t]5u:-&1]J-PCkԦ|q:<STWYwM'YE݉H"D lCNVyFͬ6vM\y3AךI3ऐg%C K.S^z8KJAQX7:DbqHB T¼FtB:}@ҭ4#U&1L;FʾC'Θۏk;C=WPuRȕè.]+]:s+6.mL쬉NAbj5Gvaf&48,C1Tic˴<¸Ng`kid@ؾ m-JSؐPn-Dv`san;Ě%<$1g(Á078,[w>*>B*^V52'+t}v-Av!`Q3*QMOGO t\k}^9\.Yk]as*4!m>>r趶dF6a)( 2ih`.hEҚUahC_UчG]7%F>5%f @yp|E) q +6 Zc z@p5 oJQ*S)&1!Xpgch=-N@flBi"9@4$_V\1H@:-Z TbCJ1QH$a|?Ϊ[ I͠J:i emNZa@{ZD lICrtL'(Sk7 Mh0-mT!A0FEuD3m=,a(؋w7]/tֵ۾=wz\ }f t n'Ǘ.52>??|Ѝ/]q=pvLG0Lwwv-? O/@:}.sM\?ǛM`Я .wեP@-StZk `ˑ3EpsQw] ] >ßV|ffL^{WS&>I@-JHn`Ӓ7Ÿy`)chESCY{mqӶJߵZ`踊-zJIȃWsk3F̵yۚ@E 3R)t,B ĿZF7m .'O My4})-2Ӆq8):8.kx@xYU Ql֐,%aLmq-r.6}"P,n_@fp5*K 5zR  )I-qɢ}@Xԧ;89L\TYsi )N+J9BDcm|+t:iBW$bKtV%E5t]:.prGS۪.$$=DsaL:⁔VV侀(*19$pimhC0[*_?? Q kt/k>ȶP}Au!yYOr0mMA-|fά} kg5V`n!Ӧ!Zj,0R|oS[abo<h 3 g鹺| X#. c%8(KVL+"oTjFG["Vc߉{(Gq~=L(Q;WP+_ 6A9G> #@O߄Ga&Ƶŷ zS,vF] |xbŔ3 /L>x: jΌ|(U2ڱ}fndҠg闗[#q \.*b%:c~Qu";$ip3O+3՝6vWȈ `r:󤵯9T޿ݼv?`0{S>`6|>߅@ Ql8<φóհΆósxy<ߖEHuJF،&|&,x|up]5\W\W^] ,)h>NX%GAyJ|e1Һ@2 P4'&M_!FOPLpBQpzwyT:I~ի KZyd՜R9߱ S\=6G~5$ 6dm H*LvtJQ󷗭RAHpľdJN5{"x9D(NyW=Li"sϕ9<JL~g%YJG@V;$ "Ed!hyڂdY1HLCGmE1qE4cp#jyljJ RjiR Z^9G=k{T\Y:ߔew1 ~UdV/ݍIb8;OWoJEP>1P ~Bke:ŧh-Y d>WJ%ZT'u$ּd}PT J)BIiR wVZ{@"Vi*-sL0Sd0=9fpP9^Ҽ6FU I9Ibws}<" yfjǜ{hNl#"-oI鑝#ه#R,h'Nӱc%K M-2AjO@coM,>9[(|jƊE?vhQ`JNQz M!}'o|x 9?KX@&<[U?|fCux=FU''j/(dp::<Ϋ%wp|_⎜j Ob+4e{eE|r.1cSAM;[puDEj:&9g%Hf-ʽD)ruYȫ>$_`+<>Å,*+6Sp? >p :WssmSś9h%ӭ(^:2?afߏ|O\hإY!XV r.vs L.dޭ.*ۉe9\BhYaܫ|%TJ(ٷ*Ǝ:g7<39H n67B3񤸧APr<~}qr&uVOHEeHFe:捛KXlr $v1 Fq&{\]>aAD"EFA'7 he2BXk@Ř9O0q\od6WzlSqRE_ߎ+lsū<>% YùZn/;IiNkEln8Ť(rb:ڋB!|bP.FI/@[b9_,yϰ|3$2M?Xs+j|ASI{PW5[R⿪ ۮ=N7GVmTSc{~ыwАn2Ĝv8Vj˾Y 9ϰ)ŽPDE%کP8h~LEby"ԴhO9؁?XU~On``>Q㈓E# 1=@cO(6UǪ^SҢ qEK=Ոw6A{#sZۭn!(:E,浲 \q*A)vS;>MbC@4;Z~*J}KlvAf`ELNHN @+gNœjD=O1ep-\7o[_W b&1&6 qJP1/Z\&`ˀRFk t`Z zztv=UHСVI,]ȄJ;HETj"!YrWՒ{ML:kOМ4Nda##`W,`c#abPő 3@V+0v^gd0bͦr%$iu;iW^bWK@ڟmm̯;?`tgy̑?-V[˥eq|Hl%0KsUi}]/&)4hj _"A\|D/0w~: :ZOn_m@P7:~:KN8 } ,R4+zv(~kk#E6 AjEы¾G3!;敫طWj}X:flb%. L--6Y'pEl@;iwb4t@`{/mp%댕EkjNd#OdVVX$1Ws0|A$ZukUx&CX&sR,#|{*#/lHay]oB/'|?^u תǫ؟.-Th!6SͬK[^rUZѳr.aOFR4Q r5zxiqOFj9o`: -ni.&KI:yu:'ԨWSQb$VN&wObr6 (Rط',Ր:`{*j6rk.W6)΀ t+b6WA O`moکǣ˔`.X=ȓsdߜXL|N('A;TD7@%:衍3vnǰ-iU&$KG 3'&FiH^^RHY ~CJ:{%s <]QXcf$VX(H-+  ;Z O*l8@. kc̢JOu D:aaS`a3BWf"QɑGo,kߏ; 0ExzFehgݚ\ t..1b4e!~'d M`p Y}\L)૾4O[WF-'{jk-n^P]hOU`TT?jI0r'&3qC3=$<؆=Uφد|1ͺ{1=\]ۥlLXa].*MǴ(zFs-r%_1 1)ji'_y>;|*c!GXWOq9-&Sj@7FWu:gt7.]]:m[g]A_3?p?t|m'Ij*0>`㼓C0IQI:M( QhuJJ8y=Z݋A؅޻৉y6F»z8q[D{.T^`yy'287F^ु7|oeƯpky3ʋu ;O'7MVdHy.87A}sk$.@Ȗ)3,wko w/Ws&;/I`zK෮vF_ۺrdu:DOuFz?Vzd4hY,Fm#ErQUdS[ pt^㯱-kQCJXLd6$ݍr\׍9o#=md&=1o{s;3'K zgKۂ.ߎ`G'=4s|<_^z?vN~ov`gt6.n!QKȋ9X{eY$Y^KQ]W"qΘyPII\+wR[ٳ

两个超经典超难应用题1、有一幢100楼的大厦,两部手机,让你设计一种算法确切地知道这部手机在第几楼摔下会坏,算法要尽量优化.2、有三根棍子,第一根上面套着n个环,最大的一个在底下,其余
两个超经典超难应用题
1、有一幢100楼的大厦,两部手机,让你设计一种算法确切地知道这部手机在第几楼摔下会坏,算法要尽量优化.
2、有三根棍子,第一根上面套着n个环,最大的一个在底下,其余一个比一个小的依次叠上去,把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面,请问怎么搬?需要搬多少次?要有推导过程.
谢绝复制粘贴流.
sevenoutman那你的具体做法是什么?

两个超经典超难应用题1、有一幢100楼的大厦,两部手机,让你设计一种算法确切地知道这部手机在第几楼摔下会坏,算法要尽量优化.2、有三根棍子,第一根上面套着n个环,最大的一个在底下,其余
真汗,好多复制我曾经在http://zhidao.baidu.com/question/56519153.html这道题里面的答案的,难道作弊的时候稍微把一些个性话的语言都改掉不会吗?难道不能比较一下我用来提问的ID,和我这个ID的差别么?我这么做不是搞恶作剧,实际上是百度逼的,我曾经用这个ID回答过一个高分题,但是答案发出去以后不显示在题目下面,再发的时候系统提示我已经回答过了,这不把人往死里逼么,不得以才重新注册一个ID去回答一下,拿到分后想转到这个ID上,但又不想放过这机会,于是就把记忆中比较经典的题目拿出来玩一下,其实一开始就是个圈套,各位莫怪,如有得罪还请海涵.嘿嘿……
只是没想到抛砖引玉,果然有更高明的答案.
第一题,我现在发现我曾经的那个作答是错的,38楼的“矩阵Metrix”的回答才是最优,不超过14次,比我多考虑了一点就是楼层越高手机越可能摔坏,佩服佩服,如果能写出推理过程就更好了.不过佩服归佩服,分不能给你,嘿嘿……sevenoutman的态度我很欣赏,和我自己很象,但答案有点让人遗憾,过程很详细,但具体做法写的太含糊,没看懂.
第二题,其实是我高中玩文曲星的时候,发现的这个游戏,当时想了整整一个下午,才总结出来的答案,当时真的觉得自己跟神一样,本来我想把自己的发现告诉数学老师的,可怕被人说是炫耀,所以遗憾至今.
其实原理很简单,只有一个环时,我可以一下放到目标棒上,那么增加一个环时,我可以按照移动一个环的方法,将第一个环移动到中转棒上,然后把增加的第二个环放到目标棒上,再按照移动一个环的方法将第一个环放到目标棒上,那么再增加一个环,还是按照这个道理.即,由于n-1个环可以移动,所以n个环的处理方法是将n-1个环移动到中转棒上,再将第n个环移动到目标棒上,再将n-1个环移动到目标棒上.还有一个十分重要的条件就是,增加一个大环的好处是,所以的环都可以放在它的上面,可以视为一个桌子.
同时还有个规律,当环数为偶数时,第一个环必须移动到中转棒上;为奇数时,第一个环必须移动到目标棒上.这个很简单,不证了.
现在来证明移动次数和盘子数量的关系.
令盘子数为n时,移动数为An

A1=1 式1
A2=2*A1 + 1 式2
A3=2*A2 + 1 式3
.
.
.
An-1=2*An-2 + 1 式n-1
An=2*An-1 + 1 式n
式1乘以2^(n-1),式2乘以2^(n-2),式3乘以2^(n-3)……式n-1乘以2^[n-(n-1)]
然后将得到的所有式子两边相加,可以消去A1——An-1所有项,最后是一个等比数列,公差为2,这就不罗嗦了,整理出来是An=2^n-1.
可惜没人给出一个让我满意的答案,否则我还真改变主意把跟给他了.我个人比较反感用一个计算机程序做这题,太没技术含量了.
个人比较喜欢第一题,实用度很高.第二题技巧性比较强,启发意义比较好.

第一步手机是用来决定在0-100层之间需要划分几个区间
第二步手机是用来在已发现可以导致手机摔坏的区间内一级一级往上加楼层已具体测试是哪一层的工具。
假设第一步手机划分的区间为a个,每个区间包含的层数为b。
则可以得出a*b=100。
所谓的最优化,既是让测试的次数尽量最小,即让a+b+1次数尽量最小,也就是让a+b最小。
现在就简单了,转化为一个...

全部展开

第一步手机是用来决定在0-100层之间需要划分几个区间
第二步手机是用来在已发现可以导致手机摔坏的区间内一级一级往上加楼层已具体测试是哪一层的工具。
假设第一步手机划分的区间为a个,每个区间包含的层数为b。
则可以得出a*b=100。
所谓的最优化,既是让测试的次数尽量最小,即让a+b+1次数尽量最小,也就是让a+b最小。
现在就简单了,转化为一个数学题。已知a*b=100,问当a+b取最小值时,a=?,b=?。
这个问题我就不回答了,在场的估计有90%以上的人能得出当a=b=10时,a+b取最小值。
具体做法就是:
将一部手机从10楼扔下,如果坏,则拿第二部手机从一楼开始,逐层往上试,则实验最大次数为10+1=11次。
如果没坏,则将第一部手机从20楼仍下,如果坏,则将第二部手机从11楼开始,逐层往上试,实验最大次数为10+2=12次。
以此类推,当第一部手机从第90层扔下时,如果坏,则从81曾逐层往上,如不坏,也不用从第一百层扔了,从91层开始吧。
第二个是2的n次方-1次
显然对于n=1时,只需1次,命题成立
如果命题对n=k-1成立
则当n=k时,首先要把之前的k-1个环移动到中间的棒,需要2^(k-1)-1次
然后把最大的移动到右边,1次
最后把中间棒上的k-1个环移动到右边,用2^(k-1)-1次
总共用2*2^(k-1)-2+1=2^k-1次
所以命题对n=k成立
根据数学归纳法,命题得证

收起

第一步手机是用来决定在0-100层之间需要划分几个区间
第二步手机是用来在已发现可以导致手机摔坏的区间内一级一级往上加楼层已具体测试是哪一层的工具。
假设第一步手机划分的区间为a个,每个区间包含的层数为b。
则可以得出a*b=100。
所谓的最优化,既是让测试的次数尽量最小,即让a+b+1次数尽量最小,也就是让a+b最小。
现在就简单了,转化为一个...

全部展开

第一步手机是用来决定在0-100层之间需要划分几个区间
第二步手机是用来在已发现可以导致手机摔坏的区间内一级一级往上加楼层已具体测试是哪一层的工具。
假设第一步手机划分的区间为a个,每个区间包含的层数为b。
则可以得出a*b=100。
所谓的最优化,既是让测试的次数尽量最小,即让a+b+1次数尽量最小,也就是让a+b最小。
现在就简单了,转化为一个数学题。已知a*b=100,问当a+b取最小值时,a=?,b=?。
这个问题我就不回答了,在场的估计有90%以上的人能得出当a=b=10时,a+b取最小值。
具体做法就是:
将一部手机从10楼扔下,如果坏,则拿第二部手机从一楼开始,逐层往上试,则实验最大次数为10+1=11次。
如果没坏,则将第一部手机从20楼仍下,如果坏,则将第二部手机从11楼开始,逐层往上试,实验最大次数为10+2=12次。
以此类推,当第一部手机从第90层扔下时,如果坏,则从81曾逐层往上,如不坏,也不用从第一百层扔了,从91层开始吧。
第二个答案
2的n次方-1
hanoi 的问题 给你一个C++的程序吧 自己去跑一下 过程都有
//Hanoi
#include"iostream.h"
void hanoi(int, char, char, char);
int i=0;
int main()
{
int m;
cout<<"Input the number of disks:" ;
cin>>m;
cout<<"The steps to moving"<hanoi(m,'A','B','C');
cout<return 0;
}
void move(char from,char to)
{
cout<"<i++;
}
void hanoi(int n,char a,char b,char c)
{
if(n==1)
move(a,c);
else
{
hanoi(n-1,a,c,b);
move(a,c);
hanoi(n-1,b,a,c);
}
}
要你你想知道怎么算的话 也可以数列的思想
a[n]=2*a[n-1]+1

收起

第一题:本题隐藏了两个可以确定的条件,第一个是每一层的高度,用目测可以大概估计出来,假设每层高H米.每增加一层势能就增加MGH.第二个隐藏条件是手力,自己对自己手的力度应该比较清楚了吧,用力握住手机,初步估计下手机硬度.然后去觉得差不多的层的下一层(或下二层)去扔(因为如果掉下来完全烂了就无法继续测了),根本手机破损程序.例如破损程序估计为L%.那么可以建立关系NMGH=kL,其中N为第几层,k为...

全部展开

第一题:本题隐藏了两个可以确定的条件,第一个是每一层的高度,用目测可以大概估计出来,假设每层高H米.每增加一层势能就增加MGH.第二个隐藏条件是手力,自己对自己手的力度应该比较清楚了吧,用力握住手机,初步估计下手机硬度.然后去觉得差不多的层的下一层(或下二层)去扔(因为如果掉下来完全烂了就无法继续测了),根本手机破损程序.例如破损程序估计为L%.那么可以建立关系NMGH=kL,其中N为第几层,k为关系系数.计出N和L的正比关系.就可以初步计算出N最小取什么值时,才会使L达到100%.然后拿第二部手机检测一下是否正确.如果正确就成功,不正确,就再建一个同上面一样的公式.这公式计出的结果会更接近答案.此种方法主要是看你第一次掉手机时,手机破损度,如果达到破损度达到85%或以上,但那么一般计算出来的结果都会正确
第二题,就是"世界末日"之谜嘛,初中就接触过了.答案是2的N次方减去1,即2^N-1.太简单了,都不想解释,上网搜下应该有很多资料.

收起

你出的是不是脑筋急转弯???

有这种题啊?
我只知道一题:
手机摔到一楼肯定就orz了

汉诺塔!!!!

1.越高越容易坏 当然 有的手机质量好不会坏
2.看不懂

你累死人家吧

1 样本损坏次数固定的查找算法 S=2
2 汉诺塔
这么经典的东西还问啊 只要自己找有的是答案
还拒绝复制!!!!????

汉诺塔...
哈哈
我文曲星里都有这个游戏
你高中数学老师没跟你讲过这样的题吗..

如果没坏,则将第一部手机从20楼仍下,如果坏,则将第二部手机从11楼开始,逐层往上试,实验最大次数为10+2=12次。
以此类推,当第一部手机从第90层扔下时,如果坏,则从81曾逐层往上,如不坏,也不用从第一百层扔了,从91层开始吧
http://zhidao.baidu.com/question/56519153.html?si=1
2.等等补充:
2的n...

全部展开

如果没坏,则将第一部手机从20楼仍下,如果坏,则将第二部手机从11楼开始,逐层往上试,实验最大次数为10+2=12次。
以此类推,当第一部手机从第90层扔下时,如果坏,则从81曾逐层往上,如不坏,也不用从第一百层扔了,从91层开始吧
http://zhidao.baidu.com/question/56519153.html?si=1
2.等等补充:
2的n次方-1
回答者:zqfbd_2008 - 魔法师 四级 7-29 11:00
第一步手机是用来决定在0-100层之间需要划分几个区间
第二步手机是用来在已发现可以导致手机摔坏的区间内一级一级往上加楼层已具体测试是哪一层的工具。
假设第一步手机划分的区间为a个,每个区间包含的层数为b。
则可以得出a*b=100。
所谓的最优化,既是让测试的次数尽量最小,即让a+b+1次数尽量最小,也就是让a+b最小。
现在就简单了,转化为一个数学题。已知a*b=100,问当a+b取最小值时,a=?,b=?。
这个问题我就不回答了,在场的估计有90%以上的人能得出当a=b=10时,a+b取最小值。
具体做法就是:
将一部手机从10楼扔下,如果坏,则拿第二部手机从一楼开始,逐层往上试,则实验最大次数为10+1=11次。
如果没坏,则将第一部手机从20楼仍下,如果坏,则将第二部手机从11楼开始,逐层往上试,实验最大次数为10+2=12次。
以此类推,当第一部手机从第90层扔下时,如果坏,则从81曾逐层往上,如不坏,也不用从第一百层扔了,从91层开始吧。
第二个答案
2的n次方-1
hanoi 的问题 给你一个C++的程序吧 自己去跑一下 过程都有
//Hanoi
#include"iostream.h"
void hanoi(int, char, char, char);
int i=0;
int main()
{
int m;
cout<<"Input the number of disks:" ;
cin>>m;
cout<<"The steps to moving"<hanoi(m,'A','B','C');
cout<return 0;
}
void move(char from,char to)
{
cout<"<i++;
}
void hanoi(int n,char a,char b,char c)
{
if(n==1)
move(a,c);
else
{
hanoi(n-1,a,c,b);
move(a,c);
hanoi(n-1,b,a,c);
}
}
要你你想知道怎么算的话 也可以数列的思想
a[n]=2*a[n-1]+1
回答者:枝上又闻啼 - 秀才 二级 7-29 11:12
第一题:本题隐藏了两个可以确定的条件,第一个是每一层的高度,用目测可以大概估计出来,假设每层高H米.每增加一层势能就增加MGH.第二个隐藏条件是手力,自己对自己手的力度应该比较清楚了吧,用力握住手机,初步估计下手机硬度.然后去觉得差不多的层的下一层(或下二层)去扔(因为如果掉下来完全烂了就无法继续测了),根本手机破损程序.例如破损程序估计为L%.那么可以建立关系NMGH=kL,其中N为第几层,k为关系系数.计出N和L的正比关系.就可以初步计算出N最小取什么值时,才会使L达到100%.然后拿第二部手机检测一下是否正确.如果正确就成功,不正确,就再建一个同上面一样的公式.这公式计出的结果会更接近答案.此种方法主要是看你第一次掉手机时,手机破损度,如果达到破损度达到85%或以上,但那么一般计算出来的结果都会正确
第二题,就是"世界末日"之谜嘛,初中就接触过了.答案是2的N次方减去1,即2^N-1.太简单了,都不想解释,上网搜下应该有很多资料.

收起

这样的问题在百度上都 能搜索到的 ,何必这么浪费分呢?!

回答者:枝上又闻啼
强悍,正解了。

手机太少,有7部才可以准确知道第几层能摔坏

问题一:在50层摔一个。判断1-50层,还是51-100层会坏。
然后从底层(1或50)一步一步的望上一层试验。
这只是数学思想,有很多现实问题欠缺考虑,先不说谁会试,还有就是没摔坏对下一次有没有影响。还有没有说明楼层的高度,没有谁规定一层一定比一百层高。1000米的一层,不用试就知道是一层,1米的100层,也是一样,或许还是摔不坏的!最快的就是取中间数,一次减半,最多6次!可是只...

全部展开

问题一:在50层摔一个。判断1-50层,还是51-100层会坏。
然后从底层(1或50)一步一步的望上一层试验。
这只是数学思想,有很多现实问题欠缺考虑,先不说谁会试,还有就是没摔坏对下一次有没有影响。还有没有说明楼层的高度,没有谁规定一层一定比一百层高。1000米的一层,不用试就知道是一层,1米的100层,也是一样,或许还是摔不坏的!最快的就是取中间数,一次减半,最多6次!可是只有两部手机。最笨的就是从一层试,然后一层一层的往上。
问题二:汉塔塔的算法。就是"世界末日"之谜,我自己觉得是和奇边偶中,小左大右有关系,网上貌似有正确算法。

收起

首先感谢楼主向我们引荐了如此好的两题(特别是第一题)
我希望楼主能再给我一天时间,相信我会给你一个有别于那么多复制黏贴的回答的(貌似答案已经揭晓了,不过我还是想自己算算。。由于精力关系,我就只思考第一题了,今天太晚了,明天我来答~)
-------------------------------------------
我来了,想了一整天,终于做出来了,此题绝没有想像中的...

全部展开

首先感谢楼主向我们引荐了如此好的两题(特别是第一题)
我希望楼主能再给我一天时间,相信我会给你一个有别于那么多复制黏贴的回答的(貌似答案已经揭晓了,不过我还是想自己算算。。由于精力关系,我就只思考第一题了,今天太晚了,明天我来答~)
-------------------------------------------
我来了,想了一整天,终于做出来了,此题绝没有想像中的简单哦,请有兴趣的读者慢慢看我的分析吧。。
第一章,何谓“算法最优化”?
楼上的“a+b+1”到底是什么?这点很重要,要使算法最优化,对于具体的项目就需要一个能衡量最优化的具体指标,下面来讨论出一个符合题意的指标来。
由于用到字母太多的话可能太抽象了,所以能用数字举例,我尽量用数字吧。
先定义几个变量:手机抗震程度为t(楼),在一种算法下,一部t=t0的手机要尝试的次数为n(t)。
那么,来解释一下a+b+1的意义。对于任意的整数t0,都可以表示成t0=αa+β,其中α、β分别表示t0被a除的商和余数,那么,对于t=t0的手机,易知在a确定的情况下,n(t0)=α+β+1,举例:对于t=27,a=13,则α=2,β=1,易知第一部手机扔三次报废(13、26、39),第二部从27楼开始尝试,一次成功,所以n(t0)=(α+1)+β,但是需要注意,n=39例外,需要α+a-1次(请读者自己验证)。
现在引入数学期望的方法,先假设在t=1到100中,每种情况的概率姑且都为1%(这是解决此题的前提!),于是,{ ∑n(t=1~100) } * 1%就可以表示所要尝试次数的期望值了,那么不妨忽略1%,于是指标出现了,那就是∑n(t=1~100),所谓最优化方案,就是是使这个值最小,那么定义对于n所取值的范围为[1,p]∩N*时,此值为f(p),最优化方案能使f(p)达到最小值,原题即p=100。
第二章,[f(100)]min怎么求?
先来看看a=b=10时的情况,首先请读者注意,此方法即使是最终方法也不完整,因为对于t∈[91,100],由于两部手机都还是好的,其实第一部手机还可以做几次分层的。(具体分析暂不讨论)
那么,根据第一章的分析,将n排成数列,为:2 3 4 ... 10 10[前十个数] 3 4 5 ... 11 11 ...,f(p)很容易得到,不过它是不是最小的呢?(还是先忽略最后10层的分析)
现在讨论一般情况,设分层情况为1≤k1<k2<...<km≤100,即第一部手机需要验证k1、k2...km层,那么容易得到对于kγ<t0<k(γ+1),n(t0)=(γ+1)+(t0-kγ);对于t0=k(γ+1),n(t0)=(γ+1)-[k(γ+1)-kγ+1],其中补充定义k0=0,我试过将f(p)表示出来,不过想要确定k1至km,使f(100)最小真的很难(读者不妨试试)。
大家一定发现了,我定义的f中100也是变量,因为f(100)的min我是用递归求的。
易知:f(0)=0,f(1)=1,f(2)=3,f(3)=6...当p较大,p=p0时,设最优化方案已经找到,不妨根据k1进行分析。分成两组,1~k1和(k1+1)~p0,对于前面一组,n的数列为2 3 ... k1 k1,对于后面一组,这样思考,对于每一层,都是用第一部手机先做了一次尝试,结果是:两部手机都没坏,并且排除了1~k1的可能性,于是对于这组数(共(p0-k1)个),可以看成是p=p0-k1的新问题,显然还是根据最优化方案解决的,于是∑n(t=(k1+1)~p0)=f(p0-k1)+(p0-k1),其中(p0-k1)是因为每种情况都要加上一次尝试。于是排出递推式:f(p0)=(2+3+...+k1+k1)+f(p0-k1)+(p0-k1)。这里要说明两点,第一,对于固定的p0,k1是使f(p)最小的定值(参见后面的讨论),第二,当p较大时(>3),可以举反例证明第一部手机不用不是最佳方案(即[f(p)]min<1+2+...+p)
下面先做化简,f(P)=(p-1)+0.5*k1*(k1+1)+f(p-k1),就以求f(4)作为例子,易知,f(4)=3+0.5*k*(k+1)+f(4-k),其中k=1,2,3,4,具体比较时,可以分别写出0.5*k*(k+1)和f(4-k)随k变化的表格,再在同一个k下算出和,比较得到和的最小值即可,易知,k取2时,f(4)=9,也就是说,将2作为k1,3~4层作为2层进行分析即可,后面的递归也是同样。。
★☆★算法总结(简略版):
定义一维数组f[]和g[],先定义前面几个数:f(0)=0,f(1)=1,f(2)=3,f(3)=6,然后再对于p++(从4开始),在表达式(p-1)+0.5*k*(k+1)+f(p-k)中顺次带入k的值(1->p),保留最小者作为f(p),(注意最小的值可能对应几种情况)。重要步骤是:记录下k的值作为g[p]。p循环到100,结束!
调出最优化方案:首先调出g[100],然后调出g[100-{ g[100] }],然后是g[100 -g[100] -g[100-{g[100]}] ]...顺次记为k1,k2-k1,k3-k2...最后将k全部求出即可
说明:对不起,由于时间和精力的关系,我也来不及反复考证算法是否正确和完善,希望对大家有所帮助。
-----------------------------------------
具体做法就是:第一部手机逐次检验第k1、k2...km楼,然后再用第二部手机从低到高检验由第一部手机确定的范围,其中k1、k2...的求法是要用到递归数列的,因为100这个数较大,只能用编程来求,求法参见算法总结(简略版)

收起

55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555

都是些笨菜 不知道在两部手机间栓一条绳子

楼上所有回答第一个问题的人全是傻子!!!!
100层楼......无语,竟然还有人说先从10楼开始摔手机......你以为这手机是什么??
所以第一个答案是:诺基亚大约3楼,三星等等大约2楼!国产1楼全部报废...!!!!!
第二个问题:建议你直接把棍子拿起来,底部朝向要移动的棍子,然后松开挡圈圈的手!一次就可以完成!...

全部展开

楼上所有回答第一个问题的人全是傻子!!!!
100层楼......无语,竟然还有人说先从10楼开始摔手机......你以为这手机是什么??
所以第一个答案是:诺基亚大约3楼,三星等等大约2楼!国产1楼全部报废...!!!!!
第二个问题:建议你直接把棍子拿起来,底部朝向要移动的棍子,然后松开挡圈圈的手!一次就可以完成!

收起

惭愧的很,我是个小地方的学生,今年高1,以前从来没有见过如此经典的问题,真的很感谢提问的人和回答的人.
但是现在又觉得这么经典的问题,用复制的方法来回答是在是浪费了~

所给的参数不足。

为什么高分题都那么那么多人,还那么那么多答案呢?

有长进

吃饱了撑着 好好的手机拿来摔干什么。。。。

你出的是不是脑筋急转弯???

第一题: 将其分为10个区域,每个区域为连续的10层,设这10个区域由下到上依次为a0,a1,a2,a3,a4,a5,a6,a7,a8,a9.然后用第一部手机试每个区域的最上面的一层,由下往上依次试。设在aj区域摔坏,则用第二部手机在aj区域从第一层开始,由低到高,逐层试,最后将得到使手机摔坏的最小层数。设每一层成为使手机摔坏的最小层数的概率相等,则这种算法的平均复杂性是1/100*{(1+2+3...

全部展开

第一题: 将其分为10个区域,每个区域为连续的10层,设这10个区域由下到上依次为a0,a1,a2,a3,a4,a5,a6,a7,a8,a9.然后用第一部手机试每个区域的最上面的一层,由下往上依次试。设在aj区域摔坏,则用第二部手机在aj区域从第一层开始,由低到高,逐层试,最后将得到使手机摔坏的最小层数。设每一层成为使手机摔坏的最小层数的概率相等,则这种算法的平均复杂性是1/100*{(1+2+3+...+10)+10+(1+2+3+...+10)+20+...(1+2+3+...+10)+100)}=6.05次.其中(1+2+3+...+10)表示1到10十个数相加。
第二题: 是汉诺塔问题,用递归算法。设这三根棍为x,y,z.写一个函数move(m,x,y,z)能够完成:“把x棍上的m个环移动到y棍上,移动过程中可以利用z棍。”则上述问题成了调用move(n,x,y,z)。而这一步可以分解为三步:
⑴把x棍上的上面的n-1个环从x棍移动到z棍上,移动过程中y棍可以利用;
⑵把x棍上最大的环移动到y棍上;
⑶把z棍上的n-1个环从z棍移动到y棍上,移动过程中x棍可以利用。
以上是递归算法,要看c程序代码可以看我的引用书220页。

收起

2.1个:1次=2^(1-1)
2个:3次=2^(2-1)
……
n个=2^(n-1)

oh

高手太多了,

第一题使用二分法;第二题参见http://zhidao.baidu.com/question/26976159.html的c++算法.

budong

太难了~~~

第一步手机是用来决定在0-100层之间需要划分几个区间
第二步手机是用来在已发现可以导致手机摔坏的区间内一级一级往上加楼层已具体测试是哪一层的工具。
假设第一步手机划分的区间为a个,每个区间包含的层数为b。
则可以得出a*b=100。
所谓的最优化,既是让测试的次数尽量最小,即让a+b+1次数尽量最小,也就是让a+b最小。
现在就简单了,转化为一个...

全部展开

第一步手机是用来决定在0-100层之间需要划分几个区间
第二步手机是用来在已发现可以导致手机摔坏的区间内一级一级往上加楼层已具体测试是哪一层的工具。
假设第一步手机划分的区间为a个,每个区间包含的层数为b。
则可以得出a*b=100。
所谓的最优化,既是让测试的次数尽量最小,即让a+b+1次数尽量最小,也就是让a+b最小。
现在就简单了,转化为一个数学题。已知a*b=100,问当a+b取最小值时,a=?,b=?。
这个问题我就不回答了,在场的估计有90%以上的人能得出当a=b=10时,a+b取最小值。
具体做法就是:
将一部手机从10楼扔下,如果坏,则拿第二部手机从一楼开始,逐层往上试,则实验最大次数为10+1=11次。
如果没坏,则将第一部手机从20楼仍下,如果坏,则将第二部手机从11楼开始,逐层往上试,实验最大次数为10+2=12次。
以此类推,当第一部手机从第90层扔下时,如果坏,则从81曾逐层往上,如不坏,也不用从第一百层扔了,从91层开始吧。
第二个答案
2的n次方-1
hanoi 的问题 给你一个C++的程序吧 自己去跑一下 过程都有
//Hanoi
#include"iostream.h"
void hanoi(int, char, char, char);
int i=0;
int main()
{
int m;
cout<<"Input the number of disks:" ;
cin>>m;
cout<<"The steps to moving"<hanoi(m,'A','B','C');
cout<return 0;
}
void move(char from,char to)
{
cout<"<i++;
}
void hanoi(int n,char a,char b,char c)
{
if(n==1)
move(a,c);
else
{
hanoi(n-1,a,c,b);
move(a,c);
hanoi(n-1,b,a,c);
}
}
要你你想知道怎么算的话 也可以数列的思想
a[n]=2*a[n-1]+1

收起

第一题:找200个人每层2个,依次扔,结果一次就见分晓了。^^
第二题:一次,只要将另一根棍子从下面穿上去把第一根棍子再抽出来OK了!!!

让2部手机以同样的力从大楼扔下,但扔到不同高度。比较受伤程度和楼层高度,按起比例推算即可!
2^n-1,从最中间开始搬

1.第二楼掉下会坏(其实快要接触地面的时候掉下才会坏了)因为上面从100楼上面下来的时候,它都在空中,它只不过是加快速度,加重地球吸引力而已

高手来了。
我给你具体的做法:
1.一共要摔14次。
(1)第1部手机依次从第A1=14,A2=27,A3=39,A4=50,A5=60,A6=69,A7=77,A8=84,A9=90,A10=95,A11=99层摔下,当手机在第An摔坏时,则:
(2)第二部手机依次从第Am+1层到第An-1一层一层摔下.
当第二部手机摔坏时即为答案.且绝对没有只摔13次就...

全部展开

高手来了。
我给你具体的做法:
1.一共要摔14次。
(1)第1部手机依次从第A1=14,A2=27,A3=39,A4=50,A5=60,A6=69,A7=77,A8=84,A9=90,A10=95,A11=99层摔下,当手机在第An摔坏时,则:
(2)第二部手机依次从第Am+1层到第An-1一层一层摔下.
当第二部手机摔坏时即为答案.且绝对没有只摔13次就能确切地知道这部手机在第几楼摔下会坏的方法.
2.这就是世界末日问题,搬法出奇的简单,有两个规则:
(1)首先将最上面的环搬到中间的一根棒上
(2)搬动唯一能搬的那个环,注意:不重复上一个步骤,每一次所能办的只有一种,不信你试试。
按上述规则搬动的规律是:不管吧哪一环搬到另一半上,搬动的次数要比上面的一环增加一倍。第一环需要1次,第二环2次,第三环4次,第四环8次,第五环16次,……,第n环2^(n-1)次。共搬动的次数为1+2+2^2+2^3+2^4+……+2^(n-1)=2^n-1
给分吧!
给分吧!
给分吧!
给分吧!

收起

2题是汉诺塔问题
var n:integer;
procedure hanoi(n:integer;a,b,c:char);
begin
if n=1 then writeln(a,'->',n,'->',c)
else
begin
hanoi(n-1,a,c,b);
wri...

全部展开

2题是汉诺塔问题
var n:integer;
procedure hanoi(n:integer;a,b,c:char);
begin
if n=1 then writeln(a,'->',n,'->',c)
else
begin
hanoi(n-1,a,c,b);
writeln(a,'->',n,'->',c);
hanoi(n-1,b,a,c);
end;
end;
begin
readln(n);
hanoi(n,'A','B','C');
end.

收起

第一步手机是用来决定在0-100层之间需要划分几个区间
第二步手机是用来在已发现可以导致手机摔坏的区间内一级一级往上加楼层已具体测试是哪一层的工具。
假设第一步手机划分的区间为a个,每个区间包含的层数为b。
具体做法就是:
将一部手机从10楼扔下,如果坏,则拿第二部手机从一楼开始,逐层往上试,则实验最大次数为10+1=11次。
如果没坏,则将第一部...

全部展开

第一步手机是用来决定在0-100层之间需要划分几个区间
第二步手机是用来在已发现可以导致手机摔坏的区间内一级一级往上加楼层已具体测试是哪一层的工具。
假设第一步手机划分的区间为a个,每个区间包含的层数为b。
具体做法就是:
将一部手机从10楼扔下,如果坏,则拿第二部手机从一楼开始,逐层往上试,则实验最大次数为10+1=11次。
如果没坏,则将第一部手机从20楼仍下,如果坏,则将第二部手机从11楼开始,逐层往上试,实验最大次数为10+2=12次。
以此类推,当第一部手机从第90层扔下时,如果坏,则从81曾逐层往上,如不坏,也不用从第一百层扔了,从91层开始吧。
第二个是2的n次方-1次
显然对于n=1时,只需1次,命题成立
如果命题对n=k-1成立
则当n=k时,首先要把之前的k-1个环移动到中间的棒,需要2^(k-1)-1次
然后把最大的移动到右边,1次
最后把中间棒上的k-1个环移动到右边,用2^(k-1)-1次
总共用2*2^(k-1)-2+1=2^k-1次
所以命题对n=k成立
根据数学归纳法,命题得证
回答者:t0928 - 江湖豪侠 十一级 7-29 10:56
第一步手机是用来决定在0-100层之间需要划分几个区间
第二步手机是用来在已发现可以导致手机摔坏的区间内一级一级往上加楼层已具体测试是哪一层的工具。
假设第一步手机划分的区间为a个,每个区间包含的层数为b。
则可以得出a*b=100。
所谓的最优化,既是让测试的次数尽量最小,即让a+b+1次数尽量最小,也就是让a+b最小。
现在就简单了,转化为一个数学题。已知a*b=100,问当a+b取最小值时,a=?,b=?。
1.这个问题我就不回答了,在场的估计有90%以上的人能得出当a=b=10时,a+b取最小值。
具体做法就是:
将一部手机从10楼扔下,如果坏,则拿第二部手机从一楼开始,逐层往上试,则实验最大次数为10+1=11次。
如果没坏,则将第一部手机从20楼仍下,如果坏,则将第二部手机从11楼开始,逐层往上试,实验最大次数为10+2=12次。
以此类推,当第一部手机从第90层扔下时,如果坏,则从81曾逐层往上,如不坏,也不用从第一百层扔了,从91层开始吧
http://zhidao.baidu.com/question/56519153.html?si=1
2.等等补充:
2的n次方-1
回答者:zqfbd_2008 - 魔法师 四级 7-29 11:00
第一步手机是用来决定在0-100层之间需要划分几个区间
第二步手机是用来在已发现可以导致手机摔坏的区间内一级一级往上加楼层已具体测试是哪一层的工具。
假设第一步手机划分的区间为a个,每个区间包含的层数为b。
则可以得出a*b=100。
所谓的最优化,既是让测试的次数尽量最小,即让a+b+1次数尽量最小,也就是让a+b最小。
现在就简单了,转化为一个数学题。已知a*b=100,问当a+b取最小值时,a=?,b=?。

收起

果然全是复制粘贴流...汗...
本人有一个很简单的方法(题一,不知对不对):
要知道100(A)层楼在哪一层会坏,第一次从A/2(50)层摔,好,则在A/2+A/4(75)层摔;坏,则在A/2-A/4(25)层摔;以后依此类推,只需摔6次;
我觉得这实际上就是一个if or 的简单编程(本人原来搞过计算机竞赛,感觉这题挺有点当年的感觉~),相信你要是在搞竞赛的话刚开始肯定...

全部展开

果然全是复制粘贴流...汗...
本人有一个很简单的方法(题一,不知对不对):
要知道100(A)层楼在哪一层会坏,第一次从A/2(50)层摔,好,则在A/2+A/4(75)层摔;坏,则在A/2-A/4(25)层摔;以后依此类推,只需摔6次;
我觉得这实际上就是一个if or 的简单编程(本人原来搞过计算机竞赛,感觉这题挺有点当年的感觉~),相信你要是在搞竞赛的话刚开始肯定是不适应的...
第二题就很有难度了,我不确信楼上那些说得对不对,但这题要是编起来会很费脑筋的!

收起

第一步手机是用来决定在0-100层之间需要划分几个区间
第二步手机是用来在已发现可以导致手机摔坏的区间内一级一级往上加楼层已具体测试是哪一层的工具。
假设第一步手机划分的区间为a个,每个区间包含的层数为b。
则可以得出a*b=100。
所谓的最优化,既是让测试的次数尽量最小,即让a+b+1次数尽量最小,也就是让a+b最小。
现在就简单了,转化为一个...

全部展开

第一步手机是用来决定在0-100层之间需要划分几个区间
第二步手机是用来在已发现可以导致手机摔坏的区间内一级一级往上加楼层已具体测试是哪一层的工具。
假设第一步手机划分的区间为a个,每个区间包含的层数为b。
则可以得出a*b=100。
所谓的最优化,既是让测试的次数尽量最小,即让a+b+1次数尽量最小,也就是让a+b最小。
现在就简单了,转化为一个数学题。已知a*b=100,问当a+b取最小值时,a=?,b=?。
1.这个问题我就不回答了,在场的估计有90%以上的人能得出当a=b=10时,a+b取最小值。
具体做法就是:
将一部手机从10楼扔下,如果坏,则拿第二部手机从一楼开始,逐层往上试,则实验最大次数为10+1=11次。
如果没坏,则将第一部手机从20楼仍下,如果坏,则将第二部手机从11楼开始,逐层往上试,实验最大次数为10+2=12次。
以此类推,当第一部手机从第90层扔下时,如果坏,则从81曾逐层往上,如不坏,也不用从第一百层扔了,从91层开始吧
http://zhidao.baidu.com/question/56519153.html?si=1
2.等等补充:
2的n次方-1

收起