微软经典面试题-海盗分宝石,20分钟给出答案即可获得年薪8万美金的职位
微软经典面试题-海盗分宝石,20分钟给出答案即可获得年薪8万美金的职位
反推过来想吧,进一步分析
5号:不同意,或者有条件同意
轮到5号时,形成的状态是:
1得到0个宝石,死
2得到0个宝石,死
3得到0个宝石,死
4得到0个宝石,死
5得到100个宝石,活,同意
此海盗是最后一个轮到,不存在生命危险,所以也没必要同意!除非有得到一定的好处
但是他想捞到好处是很有难度的,因为其他海盗也很聪明!
其实他当然也会意识到这点
所以此海盗不会同意别人的方案,除非他获得一定的利益
4号:同意
轮到4号时,形成的状态是:
1得到0个宝石,死
2得到0个宝石,死
3得到0个宝石,死
4得到0个宝石,可以保不死(但也说不定),同意
5得到100个宝石,活,同意(或不同意)
此海盗最担心的是轮到他头上(祈祷中...),即使全部100个宝石奉送给5号,他才有可能保不死(仍然有风险),否则就死定了!(注意是超过半数同意才行,也就是说刚好达到半数还不够,否则就可以独吞了)
所以此海盗不管如何都会同意别人的方案,否则对他来讲没有任何好处,反而增加步步逼近的危险!
3号:不同意,或者有条件同意
轮到3号时,形成的状态是:
1得到0个宝石,死
2得到0个宝石,死
3得到100个宝石,活,同意
4得到0个宝石,活,同意
5得到0个宝石,活,不同意
轮到3号时,他是绝不会巴结5号的,因为不知道他需要多少度才会同意,要巴结的话只要给4号1个宝石就够了,但事实上一个都不用巴结,因为5号也会认识到这点,所以5号是绝对不同意的,介于5号不同意,4号也会猜想到这点,所以4号就不能再不同意,否则4号是自找死路,所以就固然有大于半数的支持者了
但是能否轮到他呢?
问题是这海盗太聪明了,事实上他进一步想,突然觉得不对,因为将不可能轮到他的,前面2号的海盗没那么傻,说不定他等下一个也得不到,所以在1号的方案时,他的要求变的很低了,求求1号给我1颗宝石吧,我会同意的....(这样也行$!@$%^%&*^),哈哈:),早拿早好嘛,有一个算一个!
所以此海盗肯定不同意别人的分配方案,除非有得到一点好处
2号:不同意
轮到2号时,形成的状态是:
1得到0个宝石,死
2得到99个宝石,活,同意
3得到0个宝石,活,不同意
4得到0个宝石,活,同意
5得到1个宝石,活,同意
要是轮到此海盗他必会拿走99颗宝石,然后给1颗5号即可!
原因:
3号不同意的,因为他想要得到100个宝石的机会(如果给1个以上,或许会同意)
4号同意,否则只有坏处多多,有风险存在
5号给他1个宝石就OK了,否则到了下一轮,将一颗也得不到,不拿白不拿!
所以此海盗不会同意1号的分配方案,除非给他100颗宝石
其实不然,这都是错误的想法,怪就怪他们太聪明了!
因为他知道1号很聪明的,他早已算出1号将会以99,0,1,0,0的分法搞定,所以轮不到他,想得到99颗的想法才是妄想,而且1号也不可能给他1-2颗宝石的,他知道1号要是这样做是在冒风险,所以他只有不同意一博
1号:此海盗当然也聪明了,他早已知道后面的海盗心里想什么,首先4号是一定同意了(因为不管哪一轮他都没有宝石,如果不早点同意的话说不定局势改变了,有风险啊),那么只要再找一个海盗同意即可安全了,左思右想,巴结谁呢?还用想...汗!
2号肯定不给的,给了说不定也是白给
3号给1颗就能搞定,否则到了下一轮他一个也得不到
5号给1颗不一定够呀(除非给2颗,因为到了下一轮(2号决定时)他仍然有机会得到1颗宝石,所以5号干嘛急着同意呢,不急不急)
最终结局的状态是:
1得到99个宝石,活,同意
2得到 0个宝石,活,不同意
3得到 1个宝石,活,同意
4得到 0个宝石,活,同意
5得到 0个宝石,活,不同意
即:99,0,1,0,0 (1号利益最大化)
请教一个关于python的问题
布尔类型是一个逻辑量,区别于算术量的是逻辑量表示了两个对立的矛盾,也就是说逻辑值只可能有两个,就是真和假。
在python中(也在大多数的编程语言中),真(True)在计算机内部表示为数值类型1,而假(False)表示成0.
可以在python中测试:True == 1 结果为True,False == 0 结果为False.但是True == 任何其他的(不是1) 都为False, False也同理。
这只是计算机表示的问题,python规定 None,‘’,“”,“”“”“”,'''''',(),[],{},0,0.0,0L,0j,False为假,其他为真。
a=b 是算术运算,即把b的值赋给a,在计算机内部,由于python是由c语言实现的,用到了指针,a和b指向了同一块内存。
可测试:a=1 然后 b=a 比较id(a)和id(b),结果是一样的,说明a和b的地址一样。
a==b 是逻辑运算,得出的是逻辑值,就是真或假。
那怎么用呢?很简单,当要处理算术问题的时候当然用算术运算,有逻辑问题(通常所说的判断)的时候呢就用逻辑运算啦。