经典问题:9个枪手!!! (100分)

  • 主题发起人 魔鬼大师
  • 开始时间
大家辛苦了
可是我发觉大家的思维陷入了误区,
我再提示一下
我举个例子
假如最后一轮剩下H,I,如果我问谁活的机率大,
我相信大家都会说I活的机率大
其实不然,请看下面的死亡机率分析:
H I
第一轮 0.2*0.9 0.8
第二轮 .........................
你说谁更危险呢
 
哦,多轮的情况比较复杂,我以上的计算是针对单轮的,没有考虑多轮。
 
性命相关,
岂能儿戏
 
不是吧,“性命相关,岂能儿戏”这句话应该说给出这题的人听啊,如果这些杀手足够聪明就会选择射杀裁判或者对天开枪,可见还是不够聪明。
 
另外,并非每轮一定会死掉一个,所以情况更加复杂。
 
我看这个问题就是编程也没有思路啊。
概率问题怎么编程?难道用仿真么?:)
仅考虑两个人的情况:
A B ,那么双方只有一个目标,A击中的概率比B小,所以 B 存活率 大。
三个人:
A B C:A 应该是想着打C,因为B/C死一个的话,他当然宁愿死C,轮到B来选,肯定还是打C,
这样两个人的概率10% 20% 是不是能简单相加呢,=30%? 这样就和C打任一人的概率持平了,
轮到C选择,和两人的道理一样,他肯定会去打B,这样 C死和B中死的概率相等,而A反倒活
下来了,没人在第一轮会打他,但在死了一人之后,A死的机会还是大一些。所以活下来机会
大的应该是B/C中的一人.........
主要就是刚才提出的 概率是不是能简单相加,还是别的算法?如果 >30%,那就B活,否则C活。
如果把三个人的问题想通了,估计后面就简单了。
按这种思路下来,我觉得Traveller分析的有道理。
也不知道我分析的对不对,请高手指正!
 
第一轮好办,主要是第二轮不好处理。
 
我觉得应该出一张二维表,表示最后两两的存活率,比如C(A,B)表示A,B的A存活率
C(B,A)表示B的存活率。出一张表然后再看,谁先死。。。很复杂
 
每个枪手最有威胁的人是相邻的两个人,大于一点或小于一点的,所以会打比自己稍高一点儿的,
照这个规律
A会选择打B、因为他知道I肯定不会打他,
B会选择打C、 A对于B来说,和C相比威胁较小,所以会打C,因为I有人会去打,而且I也不会打自己,
C打的时候,同样只会考虑打B或D,因为命中率再高的不会打自己,而且有别人去打,所以他会打D
照这样循环,
80%的会打90%,而90%会打80%,
他们应该会是这样的规律,这样的话自己相对安全。
每个人的被打中的机率超过100%后就有可能会死,
照这样,第一轮,80%的人会被70%的打,80%的人又会打90%、90%还会打80%, 80%的人就死了
第二轮,60%的人被50%的人打了两次,应该是死了,70%的人看到80%的人死了之后会打90%,90%的人被80%和70%的人分两轮打过后,应该也死了
第三轮,40%和50%的人又会被打死,
第四轮,30%的人会被打死,
第五轮,70%的人被打死,
第六轮,只剩下10%和20%的人,但这时20%的人被打中的机率只剩下50%,而10%的还有100%
照这样在第十轮的时候,20%的人会被10%的人干掉,
 
这个问题有那么复杂吗?
我觉得正常的思维是每个枪手应该都会先打对自己威胁最大的枪手,也就是打命中率
除自己外最高的枪手。那么命中率越高的人其死亡的可能性也就越大,I将最先受到
前面8个人攻击,8个人只要平均每人有百分之十几的命中率,就足以让I翘翘,所以
I 第一轮就死;接着就是H,G,F,E,D,C,直到剩下B和A,这时候命中率高才起到作用
了,在若干次(可以计算的出)开火后,A将死在B的枪下。所以
最后存活可能性最大的是: B
 
to 疾风:
概率是不能这样相加的, 被命中率为50%的人打两次, 则被命中的概率为75%, 也就是1-(1-50%)*(1-50%)。
to YuZi:
问题就出在“所有的枪手都足够聪明”上,也就是说,每个人采用的策略都必须使所有人的存活率最高,否则违反规则的那个就会被受害者(存活率小于全都遵守规则的情况下的存活率)干掉。
而且,你的生存率=向你开枪的人的生存率*(1-向你开枪的人的命中率),这点很重要。
在三个人的情况下:
假设A向B开枪,B向C开枪,C向A开枪,那么,B的生存率=(1-A),C的生存率=B的生存率*(1-B),A的生存率=C的生存率*(1-C),代入A=20%,B=40%, C=60%,得出此顺序下生存率为:A:0.192, B:0.8, C:0.48。总计生存率1.472
假设A向C开枪,B向A开枪,C向B开枪,那么,C的生存率=(1-A), A的生存率=(1-B),B的生存率=C的生存率*(1-C),代入得出A:0.6, B:0.32, C: 0.8,总计1.72。
穷举其他各种可能之下的总生存率,得出A->C, B->A, C->B 的顺序是一个皆大欢喜的解。
如果A选择向B开枪,那么A获得最大生存率的情况只有一种,那就是B和C都不会向他开枪,但是这种情况下B的生存率只有0.1536,C的生存率只有0.48,是各种选择中最低的,所以,显然B和C必然选择其他三种方案,从而让A的存活率只有0.192,因此A只有选择向C开枪。
但是如果存在多轮开枪的情况就比较复杂了,尤其是并没有一轮必然淘汰一个或者多个大限制,而是淘汰0~n-1之间的一个随机数。
 
又想提醒一下
即使是A和I对决,
也并不是说A100%会死
只是I比A存活率高而已
 
没想到这儿的程序员们都不够聪明
真令我有点失望了
 
我真想说你这个题简直就不是一个算法的问题,就像你让人来证1+1=2一样,是个白痴问题!
如果所有的枪手足够聪明,那么,如果我是B,那么当A枪枪响的时候我就倒地装死,
那么B没死,然后轮到C,C枪响,E倒地装死, E没死! 这样的话,概率成乎不能用算法来
解决! 你这题无解!
那么我问你有两个点,A点和B点,C点停在A点与B点之间,那你说C点的具体位置的可能性有
多少?
无穷大呀老大!
所以大家可以不需要再做,这题无解!
 
每个人的命中率不是100%,所以都有可能失误,即然大家都想活命,如果
每个人开枪的时候都打不准,岂不是大家都活下来下了?
 
一帮笨蛋
 
那你把答案贴出来,看看是不是推不倒的答案,这题既然有解也是极其牵强的!
我不信有解!
 
我觉得哈 因为题目只是说谁活的几率最大 所以每一枪打在对方身上只是个百分比而已
人不死的 你能说90%的命中率那对方就一定要over吗? 所以我觉得应该从这个思路入手
或许 有些道理
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部