论坛首页 Java企业应用论坛

国王与100个囚犯

浏览 24058 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (6)
作者 正文
   发表时间:2010-08-06  
呵呵,全部写进一个main方法里,比行数短的话,java支持一行搞定
0 请登录后投票
   发表时间:2010-08-06  
Crusader 写道
晕,你自己想想你被关进去后,第一天释放的是你,你知不知道?
看问题不能太死哦~

LZ啊,我真木有钻牛角尖,我觉得题目设定了时间不确定这个条件,就肯定有它的限制条件,包括谁也不知道自己是不是第一个出去囚犯,为什么呢?
你想想每天随即开门,貌似也没有说每天定点开门吧,如果我第一天的晚上11:59放出去一个囚犯,然后再第二天的00:01分再放出去一个囚犯,你会知道吗?你如何知道?求指点
还有啊,编码属于数学,数学属于科学,科学需要严谨,没有哪个数学公式是用日常常识和规律来论证的,你的思路很好,但人和人之间的沟通真的有待提高。。。
PS:是不是认真我就输了~~
0 请登录后投票
   发表时间:2010-08-06  
mxxzxc 写道
Crusader 写道
晕,你自己想想你被关进去后,第一天释放的是你,你知不知道?
看问题不能太死哦~

LZ啊,我真木有钻牛角尖,我觉得题目设定了时间不确定这个条件,就肯定有它的限制条件,包括谁也不知道自己是不是第一个出去囚犯,为什么呢?
你想想每天随即开门,貌似也没有说每天定点开门吧,如果我第一天的晚上11:59放出去一个囚犯,然后再第二天的00:01分再放出去一个囚犯,你会知道吗?你如何知道?求指点
还有啊,编码属于数学,数学属于科学,科学需要严谨,没有哪个数学公式是用日常常识和规律来论证的,你的思路很好,但人和人之间的沟通真的有待提高。。。
PS:是不是认真我就输了~~


谢谢,如果你仔细看的话,会发现我在后面的跟贴中已经给出了“不知道第一天”这种情况的代码
0 请登录后投票
   发表时间:2010-08-07  
好这样不对吧??我也搞糊涂了
0 请登录后投票
   发表时间:2010-08-08  
楼主的题目很有意思,其实不用写程序就应该可以知道这个天数大概是多少天了。

假设安排一个计数员,并且是第一次出去。而且只有计数员才有关灯的权利。
假设灯泡最初是开着的。

15分钟内先约定好:
    其他的99个人每人
       1、第一次出去的时候如果发现灯泡是熄灭的,就将其打开(注意,只是打开这么一次,尔后如果有幸出去发现灯泡是亮的,也不要去管,因为你打开一次,就相当于你出去了一次,但是计数员只需要统计你出去一次就行了)
       2、如果第一次出去发现灯泡是熄灭的,也不要去打开,因为没有这个权利,只有计数员才能打开,出去放风后,不做任何事情(当然出去呼吸新鲜空气也是不错的),然后回来。如果下次出去发现灯是亮的,就将上面的动作 1  做一遍。

好了,现在规定好了条件,开始服刑。关进牢房!

在数学上,我们先假设最好的一种方法:
   当第一个人(计数员)出去的时候,关掉灯,并且人数Number加上1,
   假设第二个出去的是99人中的一个人,因为想快点出狱,所以他立马开灯,开完后就回牢房了,
   假设第三个是计数员,出去后很快就可以关灯,人数Number又加上1,
   现在我们假设99人中的出去的那个不在出去了,出去的是另外一个,这样就打开灯泡,然后回牢房了,
   假设第五个是计数员,出去后很快就可以关灯,人数Number又加上1,
  
   假设这99人中的确是那么幸运,每个人都是间隔着计数员出去,而且恰好是每个人有且仅有一次,

   那么最后计数员出去关灯的时间应该是Number=199天
  
   这样,很幸运的,他们就可以在短时间内集体出狱,回家吃饭了。

可是呢?
   监狱用了个什么随机开门,唉,这才是最不爽的。每个人每天出去的几率是百分之一,真是低。
    首先说一种极端情况,如果第一次计数员出去开灯后,此后再没有出去过,那这个就是无解了,所有人都甭想出去了,不过这个概率很小,忽略不计。
    其实按平均数来算的话,假设随机数就是平均数,每个人的概率就是百分之一,按这个概率挑个最好的。
    因为计数员是一定要出去100天的(计数的需要),而每次的几率是百分之一,所以需要10000天,当然用程序的解决方法算出来在10000天左右,但是这个数字未免太大了,10000天就有超过30年了,出得监狱,这辈子也快玩完了,还混个鬼!

所以呢
干脆在15分钟的时间里,首先想好这个解决方法,让后当面和国王讲清楚,既然国王只是想要证明而已,那就当场给他证明,和他谈判,教会他这个解决方案,如果谈得好,说不定就不用去做囚犯了。当然谈崩了,再去实施这个办法也行!

谈判才是最重要的,多交流,说不定就会少走很多“弯路”。
0 请登录后投票
   发表时间:2010-08-08  
怎么计数啊,不是没有任何标记么?
0 请登录后投票
   发表时间:2010-08-09  
Crusader 写道
思路:
·选被关后第一天出去的囚犯作为特殊的计数员
·计数员被放出去,第一天将灯打开,今后每次放出去的时候,如果遇见灯是熄灭的,则将灯打开,并将记数加1
·而其他囚犯为普通囚犯,普通囚犯如果被放出去,在第一次遇见灯是打开的时候将其关闭(其他情况,即遇见灯是熄灭或第2,3,4..次遇见灯是开着的时候什么也不做)
=========================

思路里面不是说了么?囚犯在被关前的30分种商量,就已经说好了,谁第一个出去谁做计数的,大家各自按自己角色行事,我想是否为第一天被放风只要脑壳没问题,都能分辨出来

=============
100次中可能有些人关了几次呢

普通囚犯如果被放出去,在第一次遇见灯是打开的时候将其关闭(其他情况,即遇见灯是熄灭或第2,3,4..次遇见灯是开着的时候什么也不做) 。

=========



应该这样设定:直接选出一个人做计数员,不是看谁第一个出去啊,谁知道谁第一个出去啊,是不是?
0 请登录后投票
   发表时间:2010-08-09  
题目中并没有明确指定灯是开着的还是关着的,所以不应该在程序中设定初始值,它也应该是随即的。

解决灯的问题,我想思路应该是这样的,每个囚犯在前两次被放出时都对灯做关闭操作,那么等到计数员数到

200时,说明肯定每个囚犯都放出去过了
0 请登录后投票
   发表时间:2010-08-09   最后修改:2010-08-09

1:任选一人做记录员(记录方式:取走灯泡).

2:记录员负责记录开灯次数(temp=1开灯,n次数).

3:其它人负责关灯,每人只能关一次灯(temp=0关灯).

4.当n=100时代表所有人都被放风咯

 

 

public class Taopao {
	public static void main(String[] arg) {
		int  n = 0, temp = (int) (Math.random() > 0.5 ? 1 : 0),i=0;//n开灯次数,temp灯的状态,i统计天数
		while (n < 100) {//记录了100次结束,解放咯
			i++;
			if (temp == 0 && (int) (Math.random() * 99+1) == 1) {//每次记录员被选择概率为1%
				n++;
				temp = 1;
			} else if(temp==1 && (int) (Math.random() * 98+1) != 1){//每次每人不重复概率98/99
				temp=0;
			}
		}
		System.out.println("出来咯!用了大约"+i/365+"年!");
	}
}

 

 

20-30年的概率真是太长了~!,当然不会是这样咯,任何一个被选中100的次的人就是真实的记录着,可以去像国王交差咯..

所以如果犯人运气特差劲,非常差劲,也最多只会关99*100/365=27.12年.运气好就100多天吧...

 

0 请登录后投票
   发表时间:2010-08-09   最后修改:2010-08-09
我承认,你是程序员。而我,也变笨了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics