锁定老帖子 主题:国王与100个囚犯
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (6)
|
|
---|---|
作者 | 正文 |
发表时间:2010-08-06
呵呵,全部写进一个main方法里,比行数短的话,java支持一行搞定
|
|
返回顶楼 | |
发表时间:2010-08-06
Crusader 写道 晕,你自己想想你被关进去后,第一天释放的是你,你知不知道?
看问题不能太死哦~ LZ啊,我真木有钻牛角尖,我觉得题目设定了时间不确定这个条件,就肯定有它的限制条件,包括谁也不知道自己是不是第一个出去囚犯,为什么呢? 你想想每天随即开门,貌似也没有说每天定点开门吧,如果我第一天的晚上11:59放出去一个囚犯,然后再第二天的00:01分再放出去一个囚犯,你会知道吗?你如何知道?求指点 还有啊,编码属于数学,数学属于科学,科学需要严谨,没有哪个数学公式是用日常常识和规律来论证的,你的思路很好,但人和人之间的沟通真的有待提高。。。 PS:是不是认真我就输了~~ |
|
返回顶楼 | |
发表时间:2010-08-06
mxxzxc 写道 Crusader 写道 晕,你自己想想你被关进去后,第一天释放的是你,你知不知道?
看问题不能太死哦~ LZ啊,我真木有钻牛角尖,我觉得题目设定了时间不确定这个条件,就肯定有它的限制条件,包括谁也不知道自己是不是第一个出去囚犯,为什么呢? 你想想每天随即开门,貌似也没有说每天定点开门吧,如果我第一天的晚上11:59放出去一个囚犯,然后再第二天的00:01分再放出去一个囚犯,你会知道吗?你如何知道?求指点 还有啊,编码属于数学,数学属于科学,科学需要严谨,没有哪个数学公式是用日常常识和规律来论证的,你的思路很好,但人和人之间的沟通真的有待提高。。。 PS:是不是认真我就输了~~ 谢谢,如果你仔细看的话,会发现我在后面的跟贴中已经给出了“不知道第一天”这种情况的代码 |
|
返回顶楼 | |
发表时间:2010-08-07
好这样不对吧??我也搞糊涂了
|
|
返回顶楼 | |
发表时间: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分钟的时间里,首先想好这个解决方法,让后当面和国王讲清楚,既然国王只是想要证明而已,那就当场给他证明,和他谈判,教会他这个解决方案,如果谈得好,说不定就不用去做囚犯了。当然谈崩了,再去实施这个办法也行! 谈判才是最重要的,多交流,说不定就会少走很多“弯路”。 |
|
返回顶楼 | |
发表时间:2010-08-08
怎么计数啊,不是没有任何标记么?
|
|
返回顶楼 | |
发表时间:2010-08-09
Crusader 写道 思路:
·选被关后第一天出去的囚犯作为特殊的计数员 ·计数员被放出去,第一天将灯打开,今后每次放出去的时候,如果遇见灯是熄灭的,则将灯打开,并将记数加1 ·而其他囚犯为普通囚犯,普通囚犯如果被放出去,在第一次遇见灯是打开的时候将其关闭(其他情况,即遇见灯是熄灭或第2,3,4..次遇见灯是开着的时候什么也不做) ========================= 思路里面不是说了么?囚犯在被关前的30分种商量,就已经说好了,谁第一个出去谁做计数的,大家各自按自己角色行事,我想是否为第一天被放风只要脑壳没问题,都能分辨出来 ============= 100次中可能有些人关了几次呢 普通囚犯如果被放出去,在第一次遇见灯是打开的时候将其关闭(其他情况,即遇见灯是熄灭或第2,3,4..次遇见灯是开着的时候什么也不做) 。 ========= 应该这样设定:直接选出一个人做计数员,不是看谁第一个出去啊,谁知道谁第一个出去啊,是不是? |
|
返回顶楼 | |
发表时间:2010-08-09
题目中并没有明确指定灯是开着的还是关着的,所以不应该在程序中设定初始值,它也应该是随即的。
解决灯的问题,我想思路应该是这样的,每个囚犯在前两次被放出时都对灯做关闭操作,那么等到计数员数到 200时,说明肯定每个囚犯都放出去过了 |
|
返回顶楼 | |
发表时间: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的次的人就是真实的记录着,可以去像国王交差咯..
|
|
返回顶楼 | |
发表时间:2010-08-09
最后修改:2010-08-09
我承认,你是程序员。而我,也变笨了。
|
|
返回顶楼 | |