最近 作者: 主题: 内容:
 进入版区才能发表文章 
 您当前的位置: 推理之门 > 谜题解析 > 谜题大全   【版主】:tl,艾米,popodian 字体大小:
[1] [2] [3] [4]1页/共4页(总计31个回复) 下页
主 题: 小乌鸦分金子.C (Alpha)(人气:2245)
 小乌鸦精灵
1 楼: 小乌鸦分金子.C (Alpha... 01年07月21日14点42分


小乌鸦看了这么多分金子的讨论,顺手写了一个程序。

840825(自由鸟)提问:

500名海盗抢得了100块金子,打算瓜分这些金子,他们的习惯是这样分:
最厉害的一名海盗提出分配方案,然后所有的人就此方案进行表决,如果
50%或更多的海盗同意此方案,此方案就通过,并分配,否则提出方案的海盗就扔到海里,然后再提名最厉害的海盗重复上述过程
所有的海盗都乐于他们的一位同伙被扔进海里,不过如果让他们选择的话,他们还是宁可得到一笔现金。他们当然也不愿意自己被扔进海里。没有两名海盗是同等厉害的,他们都按照由上到下的等级排好了座次
最凶的一名海盗应该提出什么样的分配方案才能使他获得最多金子呢


holmos(大力)提问:

有21个海盗分10个金币,21个海盗编号分别是1、2、3....21,现由编号为21的海盗提出建议(为了方便叙述,这次将提意见的顺序改为从后向前),如果建议得到剩下海盗(包括提建议者自己)的半数以上同意,则该建议被通过,所有金币即按照这个建议来分配,如果未被通过,则该海盗将被扔进大海,由编号紧挨着在他前面的海盗提出建议,依次类推,现还已知:
1、每个海盗都极其贪婪且极端的聪明;
2、每个海盗又都非常残暴与血腥,他们以杀死其他人为乐,但这是在他们知道自己的利益不会受损的情况下才会这么作;
3、每个海盗非常多疑,他们彼此完全不信任,所以每个海盗在表决时总是尽量确保自己获得的利益,而不会去冒险从而寄希望于其他海盗分给他更大的利益。
4、每个海盗都十分怕死。



/*====小乌鸦分金子.C============================================================
* Copyright (C) 1978--2001 小乌鸦
*
* MODULE : 小乌鸦分金子.C
*
* AUTHOR : 小乌鸦
*
* DATA : Rev 1.0 Jul 10 2001 17:20 小乌鸦
* Original
*
* DESCRIPTION :关于推门的分金子问题
*
*------------------------------------------------------------------------------
*/

#include 推门

#define 小乌鸦分金子_C

#define SUM 500 /*500个人*/
#define 第0个人最厉害,以此类推
#define 智慧 每个海盗都极其贪婪且极端的聪明
#define 利益 每个海盗又都非常残暴与血腥,他们以杀死其他人为乐,但这是在他们知道自己的利益不会受损的情况下才会这么作
#define 生命 每个海盗都十分怕死

#ifdef 小乌鸦分金子_C

int 方法一(int Number) /*Number:第一个得到金子的海盗的号码*/
/*只有当前分金子的海盗才可以得到金子*/
{
int i,m;
i = Number;
m = 1;
海盗 = 100;
return(m); /*返回得到金子人数*/
}

int 方法二(int Number) /*Number:第一个得到金子的海盗的号码*/
/*当前分金子的海盗不得金子,号码在当前分金子海盗后面的连续100个人每人一块*/
{
int i,m;
i = Number;
m = 0;
do
{
海盗 = 1;
m += 1;
i += 1;
}while(m == 100)
return(m);
}

int 方法三(int Number) /*Number:第一个得到金子的海盗的号码*/
/*当前分金子的海盗不得金子,最后100个海盗每人一块*/
{
int i,m
i = 499;
m = 0;
do
{
海盗 = 1;
m += 1;
i -= 1;
}while(m == 100)
}


void 分金子(void)
{
int n = 0;
int 分到金子的人数 = 0;
int 海盗[SUM]; /* 0:没分到,
1:分到1块,
2:分到2块,
……,
99:分到99块,
100:分到100块 */


/***********海盗[n]分***********************/
if(海盗n用方法一)
{
分到金子的人数 = 方法一(n);
if(生命 > 利益)
{
第n+1个海盗会想如果同意则得不到金子;如果不同意那第n个海盗被扔到海里后自己就会成为分金子者,但是他不想被扔到海里,所以他不得不同意第n个海盗的分法。
第n+2个海盗与第n+1个海盗的想法一样。
……
第499个海盗一定不会同意,因为他分不到金子;而且他也不用担心会被扔到海里。
}
else
{
第n+1个海盗至第499个海盗都不会同意,因为他们认为就是死也要得到金子。这样就会出现当第498个海盗提出方法,而最后一个海盗(第499个海盗)不同意时,1:1没有超过半数的……
/*利益>生命的现象不会出现;以后只判断生命>利益*/
}
}
if(海盗n用方法二)
{
分到金子的人数 = 方法二(n);
第n+1个海盗至第n+100个海盗会同意,因为他们得到了金子。
第n+101个海盗一定不会同意,他想如果这次不同意下次同意的话自己就可以分到一块金子,但自己后面的海盗的想法和自己一样那自己也可能会被扔到海里。但是这样就会出现一个人数多少的问题,当拿到金子的人多于没有拿到金子的人时,分金子就会停止,多数海盗拿到了金子。
第301个海盗至第400个海盗一定不会同意,因为他如果一开始就同意了,那就拿不到金子了,而且他们也不用担心被扔到海里,因为到他们拿到金子时,他们的人数多于拿不到金子的人数。
第401个海盗至第499个海盗一定不会同意,因为他们拿不到金子。
关键就是看第n+101到第500-n-200个海盗会怎么想……
}
if(海盗n用方法三)
{
分到金子的人数 = 方法三(n);
最后100个海盗一定同意。
其他海盗也会同意,因为如果不同意得不到金子还有可能被扔下海;同意了只是得不到金子但生命保住了。
}

}

#undef 小乌鸦分金子_C

小乌鸦认为方法三最好,如果谁有更好的方法请给“小乌鸦分金子.C”打补丁。谢谢!!

感谢:

840825(自由鸟)
holmos(大力)
bete(bete)

提供给小乌鸦好的想法


  点击复制本贴地址:





乌鸦知道自己讨人嫌,
想变成人见人爱的鸽子,
所以把自己染成白色;
鸽子们看见他白里透着黑,把他赶走;
乌鸦们看见他黑里透着白,也把他赶走;
乌鸦知道----自己是另类! :h

※来源: 【 推理之门 Tuili.Com 】.

 holmos大力
2 楼: Re:小乌鸦分金子.C (Al... 01年07月12日14点17分


哈哈。。。
小乌鸦还真有意思,居然这也能写成程序。佩服的很!

顺便纠正程序中的一个BUG,例如在方法三中,并不是最后100个分得金块,而是最后200个人中的100个,这100个可能是奇数号,如1、3、5、...
也可能是偶数号,如2、4、6、...这要根据正在提建议的海盗的号码来确定。如:328号海盗分时,就必须分给2n(n=1,2,...100)号与201-264号海盗中的任意100人才能通过,而456号分的时候就必须分给2n-1(n=1,2,...100)与201-328中的任意100人才行。
明白了吗?






没有完美的犯罪......

※来源: 【 推理之门 Tuili.Com 】.

 小乌鸦精灵
3 楼: Re:Re:小乌鸦分金子.C ... 01年07月12日14点43分


【holmos在大作中谈到:】

>哈哈。。。
>小乌鸦还真有意思,居然这也能写成程序。佩服的很!

>顺便纠正程序中的一个BUG,例如在方法三中,并不是最后100个分得金块,而是最后200个人中的100个,这100个可能是奇数号,如1、3、5、...
>也可能是偶数号,如2、4、6、...这要根据正在提建议的海盗的号码来确定。如:328号海盗分时,就必须分给2n(n=1,2,...100)号与201-264号海盗中的任意100人才能通过,而456号分的时候就必须分给2n-1(n=1,2,...100)与201-328中的任意100人才行。
>明白了吗?

哇~~~~~~~~~~~~~~~~

大力兄误解了!
小乌鸦的方法三是:当前分金子的海盗得不到金子,把金子分给最后100人,每人一块。
只有这样分才能保证自己不被扔到海里。分不到金子的海盗同不同意都得不到金子,但是如果不同意,那自己就有可能被扔到海里。
如果是最后200个中的单数或双数可以得到金子的话,那就会出现如果把当前分金子者扔到海里自己就可以得到金子的现象,那样当前分金子的海盗就会有可能被扔到海里。
小乌鸦只是列出了一个最简单最安全的方法,不排除有更好的方法!! :)






乌鸦知道自己讨人嫌,
想变成人见人爱的鸽子,
所以把自己染成白色;
鸽子们看见他白里透着黑,把他赶走;
乌鸦们看见他黑里透着白,也把他赶走;
乌鸦知道----自己是另类! :h

※来源: 【 推理之门 Tuili.Com 】.

 holmos大力
4 楼: Re:Re:Re:小乌鸦分金子.C ... 01年07月12日14点57分


【小乌鸦在大作中谈到:】

>哇~~~~~~~~~~~~~~~~

>大力兄误解了!
>小乌鸦的方法三是:当前分金子的海盗得不到金子,把金子分给最后100人,每人一块。
>只有这样分才能保证自己不被扔到海里。分不到金子的海盗同不同意都得不到金子,但是如果不同意,那自己就有可能被扔到海里。
>如果是最后200个中的单数或双数可以得到金子的话,那就会出现如果把当前分金子者扔到海里自己就可以得到金子的现象,那样当前分金子的海盗就会有可能被扔到海里。
>小乌鸦只是列出了一个最简单最安全的方法,不排除有更好的方法!! :)

哦,我明白你的意思了,但是你忽略了一个最重要的条件——每个海盗都极其贪婪,都想获得最大利益。这个条件是所有这类海盗分金子问题的一个最基本的前提条件。我不知道为什么在840825的问题中他没有写到,或者他觉得已经不必再说了?不管怎样,正是由于有这个条件,才使得这类海盗分金子的问题变得有趣而复杂,也正是由于这个条件的存在,才使得结果变得唯一(至少对840825这道题目而言是这样的,后面那个21个分10个的情况下,就变的不唯一了),所以,总而言之,海盗不会随便放弃自己能获得的利益。






没有完美的犯罪......

※来源: 【 推理之门 Tuili.Com 】.

 小乌鸦精灵
5 楼: Re:Re:Re:Re:小乌鸦分金子... 01年07月12日15点06分


【holmos在大作中谈到:】
>哦,我明白你的意思了,但是你忽略了一个最重要的条件——每个海盗都极其贪婪,都想获得最大利益。这个条件是所有这类海盗分金子问题的一个最基本的前提条件。我不知道为什么在840825的问题中他没有写到,或者他觉得已经不必再说了?不管怎样,正是由于有这个条件,才使得这类海盗分金子的问题变得有趣而复杂,也正是由于这个条件的存在,才使得结果变得唯一(至少对840825这道题目而言是这样的,后面那个21个分10个的情况下,就变的不唯一了),所以,总而言之,海盗不会随便放弃自己能获得的利益。

哇~~~~~~~~~~~~~

这说要看海盗们是把“生命”放在第一位还是把“利益”放在第一位了。

“生命”与“利益”两者不可得兼!!






乌鸦知道自己讨人嫌,
想变成人见人爱的鸽子,
所以把自己染成白色;
鸽子们看见他白里透着黑,把他赶走;
乌鸦们看见他黑里透着白,也把他赶走;
乌鸦知道----自己是另类! :h

※来源: 【 推理之门 Tuili.Com 】.

 holmos大力
6 楼: Re:Re:Re:Re:Re:小乌鸦... 01年07月12日15点22分


【小乌鸦在大作中谈到:】

>哇~~~~~~~~~~~~~

>这说要看海盗们是把“生命”放在第一位还是把“利益”放在第一位了。

>“生命”与“利益”两者不可得兼!!

生命当然是第一位了!但这并不矛盾啊!
不能说“生命”与“利益”两者不可得兼!!
只能说“生命”与“全部利益”不可得兼!!
在很多情况下,经过精确的计算,确实可以做到即得金子,又保住命。
还要附带说一句,题目中还有一个缺省条件——每个海盗都极其聪明。
呵呵。。建议小乌鸦想想5个海盗分100个金子的情况吧。






没有完美的犯罪......

※来源: 【 推理之门 Tuili.Com 】.

 小乌鸦精灵
7 楼: Re:Re:Re:Re:Re:Re:... 01年07月12日15点35分


【holmos在大作中谈到:】
>生命当然是第一位了!但这并不矛盾啊!
>不能说“生命”与“利益”两者不可得兼!!
>只能说“生命”与“全部利益”不可得兼!!
>在很多情况下,经过精确的计算,确实可以做到即得金子,又保住命。
>还要附带说一句,题目中还有一个缺省条件——每个海盗都极其聪明。
>呵呵。。建议小乌鸦想想5个海盗分100个金子的情况吧。

哇~~~~~~~~~~~~~~

如果是“5个海盗分100个金子”

那第一个海盗得98块,第三个海盗得1块,第五个海盗得1块。这样第一个海盗可以得到最大的利益,第三个海盗和第五个海盗也不会不同意。这样就会有半数以上通过这个提议。
但有别一个问题:就是如果第一个海盗被扔到海里后,二比二的话怎么办?有规定吗??






乌鸦知道自己讨人嫌,
想变成人见人爱的鸽子,
所以把自己染成白色;
鸽子们看见他白里透着黑,把他赶走;
乌鸦们看见他黑里透着白,也把他赶走;
乌鸦知道----自己是另类! :h

※来源: 【 推理之门 Tuili.Com 】.

 holmos大力
8 楼: Re:Re:Re:Re:Re:Re:... 01年07月12日15点53分


【小乌鸦在大作中谈到:】

>哇~~~~~~~~~~~~~~

>如果是“5个海盗分100个金子”

>那第一个海盗得98块,第三个海盗得1块,第五个海盗得1块。这样第一个海盗可以得到最大的利益,第三个海盗和第五个海盗也不会不同意。这样就会有半数以上通过这个提议。
>但有别一个问题:就是如果第一个海盗被扔到海里后,二比二的话怎么办?有规定吗??

那不就变成4个海盗分100个金子的问题吗?题目规定:只要满足50%赞成即可通过,所以4号海盗分给自己99个,2号1个,由于在4个人中有2个赞成,达到50%,因而也将通过。






没有完美的犯罪......

※来源: 【 推理之门 Tuili.Com 】.

 小乌鸦精灵
9 楼: 小乌鸦分金子.C (Alpha... 01年07月12日15点59分


哇~~~~~~~~~~~~

可是题目不是说第一个人提出分法后就不变了吗??
如果按“那第一个海盗得98块,第三个海盗得1块,第五个海盗得1块。”的分法!没有通过,第一个海盗被扔到海里,那就会多出一块呀!怎么办???






乌鸦知道自己讨人嫌,
想变成人见人爱的鸽子,
所以把自己染成白色;
鸽子们看见他白里透着黑,把他赶走;
乌鸦们看见他黑里透着白,也把他赶走;
乌鸦知道----自己是另类! :h

※来源: 【 推理之门 Tuili.Com 】.

 holmos大力
10 楼: Re:小乌鸦分金子.C (Al... 01年07月12日17点48分


【小乌鸦在大作中谈到:】

>哇~~~~~~~~~~~~

>可是题目不是说第一个人提出分法后就不变了吗??
>如果按“那第一个海盗得98块,第三个海盗得1块,第五个海盗得1块。”的分法!没有通过,第一个海盗被扔到海里,那就会多出一块呀!怎么办???

题目中哪里说了“第一个人提出分法后就不变了”?
题目的意思应该是比较清楚的呀,首先是按序号来排列先后顺序,然后逐个提建议,如果建议得到50%的通过,则大家就按照这个方法分,然后整个“游戏”就结束了;否则,这个人被扔掉,剩下的人再接着提建议,“游戏”继续,直到某个人被通过为止。
题目中并没有说到分发不变啊?






没有完美的犯罪......

※来源: 【 推理之门 Tuili.Com 】.

[1] [2] [3] [4]1页/共4页(总计31个回复) 下页
每次上网自动访问推理之门   |    将推理之门加入收藏夹
邮件联系:zhejiong@126.com  沪ICP备2021006552号  沪公网安备31011502006128号  推理之门  版权所有 2000-2025