看我抄来的:哈哈
-----------------------------------------------------------------
数学的逻辑有时会导致看来十分怪异的结论。一般的规则是,如果逻辑推理没有漏洞,那么结论就必定站得住脚,即使它与你的直觉矛盾。 1998年9月,加利福尼亚州帕洛阿尔托的Stephen M. Omohundro寄给我一道难题,它恰好就属于这一类。这难题已经流传了至少十年,但是Omohundro对它作了改动,使它的逻辑问题变得分外复杂了。
先来看看此难题原先的形状。10名海盗抢得了窖藏的100块金子,并打算瓜分这些战利品。这是一些讲民主的海盗(当然是他们自己特有的民主),他们的习惯是按下面的方式进行分配:最厉害的一名海盗提出分配方案,然后所有的海盗(包括提出方案者本人)就此方案进行表决。如果50%或更多的海盗赞同此方案,此方案就获得通过并据此分配战利品。否则提出方案的海盗将被扔到海里,然后下提名最厉害的海盗又重复上述过程。
所有的海盗都乐于看到他们的一位同伙被扔进海里,不过,如果让他们选择的话,他们还是宁可得一笔现金。他们当然也不愿意自己被扔到海里。所有的海盗都是有理性的,而且知道其他的海盗也是有理性的。此外,没有两名海盗是同等厉害的——这些海盗按照完全由上到下的等级排好了座次,并且每个人都清楚自己和其他所有人的等级。这些金块不能再分,也不允许几名海盗共有金块,因为任何海盗都不相信他的同伙会遵守关于共享金块的安排。这是一伙每人都只为自己打算的海盗。最凶的一名海盗应当提出什么样的分配方案才能使他获得最多的金子呢?
为方便起见,我们按照这些海盗的怯懦程度来给他们编号。最怯懦的海盗为1号海盗,次怯懦的海盗为2号海盗,如此类推。这样最厉害的海盗就应当得到最大的编号,而方案的提出就将倒过来从上至下地进行。
分析所有这类策略游戏的奥妙就在于应当从结尾出发倒推回去。游戏结束时,你容易知道何种决策有利而何种决策不利。确定了这一点后,你就可以把它用到倒数第2次决策上,如此类推。如果从游戏的开头出发进行分析,那是走不了多远的。其原因在于,所有的战略决策都是要确定:“如果我这样做,那么下一个人会怎样做?”
因此在你以下海盗所做的决定对你来说是重要的,而在你之前的海盗所做的决定并不重要,因为你反正对这些决定也无能为力了。
记住了这一点,就可以知道我们的出发点应当是游戏进行到只剩两名海盗——即1号和2号——的时候。这时最厉害的海盗是2号,而他的最佳分配方案是一目了然的:100块金子全归他一人所有,1号海盗什么也得不到。由于他自己肯定为这个方案投赞成票,这样就占了总数的50%,因此方案获得通过。
现在加上3号海盗。1号海盗知道,如果3号的方案被否决,那么最后将只剩2个海盗,而1号将肯定一无所获——此外,3号也明白1号了解这一形势。因此,只要3号的分配方案给1号一点甜头使他不至于空手而归,那么不论3号提出什么样的分配方案,1号都将投赞成票。因此3号需要分出尽可能少的一点金子来贿赂1号海盗,这样就有了下面的分配方案: 3号海盗分得99块金子,2号海盗一无所获,1号海盗得1块金子。
4号海盗的策略也差不多。他需要有50%的支持票,因此同3号一样也需再找一人做同党。他可以给同党的最低贿赂是1块金子,而他可以用这块金子来收买2号海盗。因为如果4号被否决而3号得以通过,则2号将一文不名。因此,4号的分配方案应是:99块金子归自己,3号一块也得不到,2号得1块金子,1号也是一块也得不到。
5号海盗的策略稍有不同。他需要收买另两名海盗,因此至少得用2块金子来贿赂,才能使自己的方案得到采纳。他的分配方案应该是:98块金子归自己,1块金子给3号,1块金子给1号。
这一分析过程可以照着上述思路继续进行下去。每个分配方案都是唯一确定的,它可以使提出该方案的海盗获得尽可能多的金子,同时又保证该方案肯定能通过。照这一模式进行下去,10号海盗提出的方案将是96块金子归他所有,其他编号为偶数的海盗各得1块金子,而编号为奇数的海盗则什么也得不到。这就解决了10名海盗的分配难题。
Omohundro的贡献是他把这一问题扩大到有500名海盗的情形,即500名海盗瓜分100块金子。显然,类似的规律依然成立——至少是在一定范围内成立。事实上,前面所述的规律直到第200号海盗都成立。 200号海盗的方案将是:从1到199号的所有奇数号的海盗都将一无所获,而从2到198号的所有偶数号海盗将各得1块金子,剩下的1块金子归200号海盗自己所有。
乍看起来,这一论证方法到200号之后将不再适用了,因为201号拿不出更多的金子来收买其他海盗。但是即使分不到金子,201号至少还希望自己不会被扔进海里,因此他可以这样分配:给1到199号的所有奇数号海盗每人1块金子,自己一块也不要。
202号海盗同样别无选择,只能一块金子都不要了——他必须把这100块金子全部用来收买100名海盗,而且这100名海盗还必须是那些按照201号方案将一无所获的人。由于这样的海盗有101名,因此202号的方案将不再是唯一的——贿赂方案有101种。
203号海盗必须获得102张赞成票,但他显然没有足够的金子去收买101名同伙。因此,无论提出什么样的分配方案,他都注定会被扔到海里去喂鱼。不过,尽管203号命中注定死路一条,但并不是说他在游戏进程中不起任何作用。相反,204号现在知道,203号为了能保住性命,就必须避免由他自己来提出分配方案这么一种局面,所以无论204号海盗提出什么样的方案,203号都一定会投赞成票。这样204号海盗总算侥幸拣到一条命:他可以得到他自己的1票、203号的1票、以及另外100名收买的海盗的赞成票,刚好达到保命所需的50%。获得金子的海盗,必属于根据202号方案肯定将一无所获的那101名海盗之列。
205号海盗的命运又如何呢?他可没有这样走运了。他不能指望203号和204号支持他的方案,因为如果他们投票反对205号方案,就可以幸灾乐祸地看到205号被扔到海里去喂鱼,而他们自己的性命却仍然能够保全。这样,无论205号海盗提出什么方案都必死无疑。206号海盗也是如此——他肯定可以得到205号的支持,但这不足以救他一命。类似地,207号海盗需要104张赞成票——除了他收买的100张赞成票以及他自己的1张赞成票之外,他还需3张赞成票才能免于一死。他可以获得205号和206号的支持,但还差一张票却是无论如何也弄不到了,因此207号海盗的命运也是下海喂鱼。
208号又时来运转了。他需要104张赞成票,而205、206、207号都会支持他,加上他自己一票及收买的100票,他得以过关保命。获得他贿赂的必属于那些根据204号方案肯定将一无所获的人(候选人包括2到200号中所有偶数号的海盗、以及201、203、204号)。
现在可以看出一条新的、此后将一直有效的规律:那些方案能过关的海盗(他们的分配方案全都是把金子用来收买100名同伙而自己一点都得不到)相隔的距离越来越远,而在他们之间的海盗则无论提什么样的方案都会被扔进海里——因此为了保命,他们必会投票支持比他们厉害的海盗提出的任何分配方案。得以避免葬身鱼腹的海盗包括201、202、204、208、216、232、264、328、456号,即其号码等于200加2的某一方幂的海盗。
现在我们来看看哪些海盗是获得贿赂的幸运儿。分配贿赂的方法是不唯一的,其中一种方法是让201号海盗把贿赂分给1到199号的所有奇数编号的海盗,让202号分给2到200号的所有偶数编号的海盗,然后是让204号贿赂奇数编号的海盗,208号贿赂偶数编号的海盗,如此类推,也就是轮流贿赂奇数编号和偶数编号的海盗。
结论是:当500名海盗运用最优策略来瓜分金子时,头44名海盗必死无疑,而456号海盗则给从1到199号中所有奇数编号的海盗每人分1块金子,问题就解决了。由于这些海盗所实行的那种民主制度,他们的事情就搞成了最厉害的一批海盗多半都是下海喂鱼,不过有时他们也会觉得自己很幸运——虽然分不到抢来的金子,但总可以免于一死。只有最怯懦的200名海盗有可能分得一份脏物,而他们之中又只有一半的人能真正得到一块金子,的确是怯懦者继承财富。
-----------------------------------------------------------------
数学的逻辑有时会导致看来十分怪异的结论。一般的规则是,如果逻辑推理没有漏洞,那么结论就必定站得住脚,即使它与你的直觉矛盾。 1998年9月,加利福尼亚州帕洛阿尔托的Stephen M. Omohundro寄给我一道难题,它恰好就属于这一类。这难题已经流传了至少十年,但是Omohundro对它作了改动,使它的逻辑问题变得分外复杂了。
先来看看此难题原先的形状。10名海盗抢得了窖藏的100块金子,并打算瓜分这些战利品。这是一些讲民主的海盗(当然是他们自己特有的民主),他们的习惯是按下面的方式进行分配:最厉害的一名海盗提出分配方案,然后所有的海盗(包括提出方案者本人)就此方案进行表决。如果50%或更多的海盗赞同此方案,此方案就获得通过并据此分配战利品。否则提出方案的海盗将被扔到海里,然后下提名最厉害的海盗又重复上述过程。
所有的海盗都乐于看到他们的一位同伙被扔进海里,不过,如果让他们选择的话,他们还是宁可得一笔现金。他们当然也不愿意自己被扔到海里。所有的海盗都是有理性的,而且知道其他的海盗也是有理性的。此外,没有两名海盗是同等厉害的——这些海盗按照完全由上到下的等级排好了座次,并且每个人都清楚自己和其他所有人的等级。这些金块不能再分,也不允许几名海盗共有金块,因为任何海盗都不相信他的同伙会遵守关于共享金块的安排。这是一伙每人都只为自己打算的海盗。最凶的一名海盗应当提出什么样的分配方案才能使他获得最多的金子呢?
为方便起见,我们按照这些海盗的怯懦程度来给他们编号。最怯懦的海盗为1号海盗,次怯懦的海盗为2号海盗,如此类推。这样最厉害的海盗就应当得到最大的编号,而方案的提出就将倒过来从上至下地进行。
分析所有这类策略游戏的奥妙就在于应当从结尾出发倒推回去。游戏结束时,你容易知道何种决策有利而何种决策不利。确定了这一点后,你就可以把它用到倒数第2次决策上,如此类推。如果从游戏的开头出发进行分析,那是走不了多远的。其原因在于,所有的战略决策都是要确定:“如果我这样做,那么下一个人会怎样做?”
因此在你以下海盗所做的决定对你来说是重要的,而在你之前的海盗所做的决定并不重要,因为你反正对这些决定也无能为力了。
记住了这一点,就可以知道我们的出发点应当是游戏进行到只剩两名海盗——即1号和2号——的时候。这时最厉害的海盗是2号,而他的最佳分配方案是一目了然的:100块金子全归他一人所有,1号海盗什么也得不到。由于他自己肯定为这个方案投赞成票,这样就占了总数的50%,因此方案获得通过。
现在加上3号海盗。1号海盗知道,如果3号的方案被否决,那么最后将只剩2个海盗,而1号将肯定一无所获——此外,3号也明白1号了解这一形势。因此,只要3号的分配方案给1号一点甜头使他不至于空手而归,那么不论3号提出什么样的分配方案,1号都将投赞成票。因此3号需要分出尽可能少的一点金子来贿赂1号海盗,这样就有了下面的分配方案: 3号海盗分得99块金子,2号海盗一无所获,1号海盗得1块金子。
4号海盗的策略也差不多。他需要有50%的支持票,因此同3号一样也需再找一人做同党。他可以给同党的最低贿赂是1块金子,而他可以用这块金子来收买2号海盗。因为如果4号被否决而3号得以通过,则2号将一文不名。因此,4号的分配方案应是:99块金子归自己,3号一块也得不到,2号得1块金子,1号也是一块也得不到。
5号海盗的策略稍有不同。他需要收买另两名海盗,因此至少得用2块金子来贿赂,才能使自己的方案得到采纳。他的分配方案应该是:98块金子归自己,1块金子给3号,1块金子给1号。
这一分析过程可以照着上述思路继续进行下去。每个分配方案都是唯一确定的,它可以使提出该方案的海盗获得尽可能多的金子,同时又保证该方案肯定能通过。照这一模式进行下去,10号海盗提出的方案将是96块金子归他所有,其他编号为偶数的海盗各得1块金子,而编号为奇数的海盗则什么也得不到。这就解决了10名海盗的分配难题。
Omohundro的贡献是他把这一问题扩大到有500名海盗的情形,即500名海盗瓜分100块金子。显然,类似的规律依然成立——至少是在一定范围内成立。事实上,前面所述的规律直到第200号海盗都成立。 200号海盗的方案将是:从1到199号的所有奇数号的海盗都将一无所获,而从2到198号的所有偶数号海盗将各得1块金子,剩下的1块金子归200号海盗自己所有。
乍看起来,这一论证方法到200号之后将不再适用了,因为201号拿不出更多的金子来收买其他海盗。但是即使分不到金子,201号至少还希望自己不会被扔进海里,因此他可以这样分配:给1到199号的所有奇数号海盗每人1块金子,自己一块也不要。
202号海盗同样别无选择,只能一块金子都不要了——他必须把这100块金子全部用来收买100名海盗,而且这100名海盗还必须是那些按照201号方案将一无所获的人。由于这样的海盗有101名,因此202号的方案将不再是唯一的——贿赂方案有101种。
203号海盗必须获得102张赞成票,但他显然没有足够的金子去收买101名同伙。因此,无论提出什么样的分配方案,他都注定会被扔到海里去喂鱼。不过,尽管203号命中注定死路一条,但并不是说他在游戏进程中不起任何作用。相反,204号现在知道,203号为了能保住性命,就必须避免由他自己来提出分配方案这么一种局面,所以无论204号海盗提出什么样的方案,203号都一定会投赞成票。这样204号海盗总算侥幸拣到一条命:他可以得到他自己的1票、203号的1票、以及另外100名收买的海盗的赞成票,刚好达到保命所需的50%。获得金子的海盗,必属于根据202号方案肯定将一无所获的那101名海盗之列。
205号海盗的命运又如何呢?他可没有这样走运了。他不能指望203号和204号支持他的方案,因为如果他们投票反对205号方案,就可以幸灾乐祸地看到205号被扔到海里去喂鱼,而他们自己的性命却仍然能够保全。这样,无论205号海盗提出什么方案都必死无疑。206号海盗也是如此——他肯定可以得到205号的支持,但这不足以救他一命。类似地,207号海盗需要104张赞成票——除了他收买的100张赞成票以及他自己的1张赞成票之外,他还需3张赞成票才能免于一死。他可以获得205号和206号的支持,但还差一张票却是无论如何也弄不到了,因此207号海盗的命运也是下海喂鱼。
208号又时来运转了。他需要104张赞成票,而205、206、207号都会支持他,加上他自己一票及收买的100票,他得以过关保命。获得他贿赂的必属于那些根据204号方案肯定将一无所获的人(候选人包括2到200号中所有偶数号的海盗、以及201、203、204号)。
现在可以看出一条新的、此后将一直有效的规律:那些方案能过关的海盗(他们的分配方案全都是把金子用来收买100名同伙而自己一点都得不到)相隔的距离越来越远,而在他们之间的海盗则无论提什么样的方案都会被扔进海里——因此为了保命,他们必会投票支持比他们厉害的海盗提出的任何分配方案。得以避免葬身鱼腹的海盗包括201、202、204、208、216、232、264、328、456号,即其号码等于200加2的某一方幂的海盗。
现在我们来看看哪些海盗是获得贿赂的幸运儿。分配贿赂的方法是不唯一的,其中一种方法是让201号海盗把贿赂分给1到199号的所有奇数编号的海盗,让202号分给2到200号的所有偶数编号的海盗,然后是让204号贿赂奇数编号的海盗,208号贿赂偶数编号的海盗,如此类推,也就是轮流贿赂奇数编号和偶数编号的海盗。
结论是:当500名海盗运用最优策略来瓜分金子时,头44名海盗必死无疑,而456号海盗则给从1到199号中所有奇数编号的海盗每人分1块金子,问题就解决了。由于这些海盗所实行的那种民主制度,他们的事情就搞成了最厉害的一批海盗多半都是下海喂鱼,不过有时他们也会觉得自己很幸运——虽然分不到抢来的金子,但总可以免于一死。只有最怯懦的200名海盗有可能分得一份脏物,而他们之中又只有一半的人能真正得到一块金子,的确是怯懦者继承财富。
楼主不要失信与人哦。<SCRIPT LANGUAGE=javascript>
<!--
var pNum=5 //人数
var dNum=100 //钻石数目
var myArr=new Array() //定义数组,存储分配方案function splitDiamod(DiamodNum,peopleNum)
{
if (peopleNum>pNum) //如果人数超过,分配结束
return;
if (peopleNum==2) //如果等于2时初始化分配
{
myArr[0]=0
myArr[1]=dNum
}
else
{
agreeNum=(peopleNum-1)/2 // 需要求得支持的人数
isagree="" //同意的人id字符串
isagreeNum=0 //已经同意的人数
remainNum=dNum //剩余的钻石数目
//
//将以前的数最少的人之中的agreeNum个人给他们分配比他们原来多1的钻石,以获得支持
//
for (i=1;i<=agreeNum;i++)
{
min=0
for (key in myArr) //该循环得出的钻石最少的人
{
if (key==0)
minNum=myArr[key]
else
{
if ((isagree+"").indexOf(key)==-1) //如果该人已在同意列表中则不考虑
{
if (myArr[key]<minNum)
min=key
}
else
continue;
}
}
isagree=isagree+min+"," //将该人列入支持列表
myArr[min]=myArr[min]+1 //给他钻石加1
remainNum=remainNum-myArr[min] //计算剩下的钻石数目
}
for (key in myArr) //将所有没有同意的人钻石数置0
{
if ((isagree+"").indexOf(key+",")==-1)
{
myArr[key]=0
}
}
myArr[peopleNum-1]=remainNum //剩下的给自己。
}
splitDiamod(DiamodNum,peopleNum+1)
}splitDiamod(dNum,2)document.write (myArr)
//-->
</SCRIPT>为了方便,用js写的
存为html文件,就可以了
function t(r,d){
var s,a=[d],b=true,c,f;
for(i=1;i<r;i++){
s=a.concat();
c=i-s.length;
if(b)s[i-1]=0;
b=false;f=0;
for(j=0;j<s.length-1;j++){
if(s[j]==0&&f<d){
s[j]=1;c++;f++;
}else{
s[j]=0;
}
}
if(2*(c+1)>i){
b=true;
s[i]=d-f;
a=s.concat();
document.write(i+1 , "=" , a ,"<br>");
}
}
if(b)
return a;
else
return null;
}
alert(t(500,100))
</script>
我不会失信的,我要看了代码之后,根据情况给分。
我希望能看到更多人参与进来,大家交流一下。
我要是不给分,就在js里骂我,因为我常来这个论坛。
不要太悲了,希望你不要误会我的意思
刚好看到的,也许
昨夜星辰昨夜风,当初的选择我认为是对的,爱一个人并不一寂要拥有她。
爱一个人是要给她一生幸福的,即然自己没有这处能力,那就祝福她吧。
想开点。
这很对呀
var TotalGold = 100;var Cal = new Group(100);
Cal.InitD();
Cal.start(TotalGold,0);for (var i=0;i<Cal.Ds.length;i++)
{
document.write(i+":"+Cal.Ds[i].GoldAmount+"<br>");
}function Group(TotalD)
{
this.TotalD = TotalD;
this.TotalAgree = 1;
this.Ds = new Array(); this.start = Group_start;
this.InitD = Group_InitD;
}
function Group_InitD()
{
for (var i=0; i<this.TotalD; i++)
{
this.Ds[i] = new D(i);
} this.Ds[0].GoldAmount = TotalGold;
this.Ds[0].Agree = true;
}
function Group_start(TGold,Current)
{
if (this.TotalAgree/this.TotalD < 0.5)
{
this.Ds[Current+2].GoldAmount = 1;
this.Ds[Current+2].Agree = true;
this.TotalAgree++; var tmp = TotalGold;
for (var i=this.TotalD-1; i>0; i--)
{
tmp = tmp - this.Ds[i].GoldAmount;
}
this.Ds[0].GoldAmount = tmp;
this.start(this.Ds[0].GoldAmount,Current+2);
}
}function D(DId)
{
this.ID = DId;
this.GoldAmount = 0;
this.Agree = false;
}
</script>
我的分析:
包括等于的情况
分配者 p1 p2 p3 p4 p5
----------------------------
p3 x x 99 1 0
p2 x 99 0 0 1
p1 98 0 1 1 0只能大于的情况
分配者 p1 p2 p3 p4 p5
----------------------------
p3 x x 99 1 0
p2 x 97 0 2 1
p1 97 0 1 0 2
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD><BODY>
计算主进度:<BR><BR>
显示进度:<BR><BR>
<BR>
海盗数<input ID=Pirate_Count value=5>
金币数<input ID=Gold_Count value=100>
表决通过率大于(等于<INPUT TYPE="checkbox" NAME="EqualBTN" >)<input ID=Pass_Percent value="50" >
<input type=button value="计算" onclick="Start()">(参数过大计算时间会比较长)
<HR>
<BR>
<span ID=ResultPanel>...</span>
<SCRIPT LANGUAGE="JavaScript">
<!--
var PirateCount,GoldCount,PassPercent,Pirate;
var PID;
var DispStr="";function Start(){
//初始化条件
if(isNaN(Pirate_Count.value))return alert("请输入数字")
else PirateCount=Pirate_Count.value;
if(isNaN(Gold_Count.value))return alert("请输入数字")
else GoldCount=Gold_Count.value;
if(Pass_Percent.value>100||Pass_Percent.value<0||isNaN(Pass_Percent.value)||Pass_Percent.value=="")return alert("请输入0-100的数字")
else PassPercent=Pass_Percent.value/100;
//创建海盗对象集合,为了方便从1开始
Pirate=new Array();
for(i=1;i<=PirateCount;++i)
Pirate[i]=new TPirate(i);
//初始化进度条
PID=PirateCount-2;
PB1.Reposition();
PB2.Reposition();
PB1.max=PID;
ResultPanel.innerHTML="正在计算,请稍等...";
DispStr="";
Caculate();
}function OutPut()
{
if(PID>PirateCount)
{
return ResultPanel.innerHTML="海盗数:"+PirateCount+"| 金币数:"+GoldCount+"| 通过率:"+PassPercent+"<BR>"+DispStr;
}
DispStr+="Pirate"+Pirate[PID].ID+" : "+Pirate[PID].Finale+": "+Pirate[PID].NeedBallot+"<BR>";
PID++;
PB2.pos++;
PB2.Update();
setTimeout("OutPut()",5);
}function Caculate()
{
//从盗数第三个人开始提议,因为不可能低于这个值
if(PID<1)
{ PID=1;
PB2.max=PirateCount;
ResultPanel.innerHTML="计算结束,正在显示,请稍等...";
OutPut();
OutPut();
PB1.pos=PB1.max;
PB1.Update();
return 0;
}
var TreatResult=new Array();
var AllotResult;
CurPirate=Pirate[PID];//当前提议的海盗 //从下一个海盗开始依次听取他们的要求
for(VisitedID=PID+1;VisitedID<=PirateCount;VisitedID++)
{
Pirate[VisitedID].Treat();
TreatResult.push(VisitedID);//纪录提出了要求的人
//把访问过的海盗ID根据所要金币数从小到大排序,相等根据ID序号排序
var tmpind=TreatResult.length-1;
for(i=TreatResult.length-2;i>=0;--i)
{
if(Pirate[TreatResult[tmpind]].MaxGold<Pirate[TreatResult[i]].MaxGold)
{
var tmp=TreatResult[tmpind];
TreatResult[tmpind]=TreatResult[i];
TreatResult[i]=tmp;
tmpind=i;
}else break;//不需要排序直接结束排序
}
}
if(!Pirate[PID].Allot(TreatResult))
{
PID=1;
ResultPanel.innerHTML="计算结束,正在显示,请稍等...";
PB2.max=PirateCount;
OutPut();
PB1.pos=PB1.max;
PB1.Update();
return 0; }
PID--;
PB1.pos++;
PB1.Update();
setTimeout("Caculate()",5)
return 0;
}//------------------------------------------------------------
// 海盗类
//
//------------------------------------------------------------
function TPirate(ID)
{
this.ID=ID;//海盗编号从1开始
this.MaxGold=0;//每次向提议者索要的金币数
this.Finale="被投进大海喂鱼了!";//最终分配到的金币数,如果始终没有分配过,说明必死无疑
if(!document.all.EqualBTN.checked)
this.NeedBallot=Math.floor((PirateCount-ID+1)*PassPercent);//需要获得的票数,不包括自己投自己的一票
else
this.NeedBallot=Math.ceil((PirateCount-ID-1)*PassPercent);
this.Treat=TPirate_Treat;
this.Allot=TPirate_Allot;
}
//--------------------------------------------------------
//每次当有人提出分配方案时,根据自己的情况向提出者勒索
function TPirate_Treat(TargetID)
{//向提出分配方案的人说:"因为你死了他可以给我MaxGold这个数目,所以你必须多给我一块金币,否则我不会投票"
this.MaxGold++;
return this.ID
}
//---------------------------------------------------------
//每次轮到自己提出分配方案时,根据别人的要求分配金币
function TPirate_Allot(TreatResult)
{//根据其他人的要求分配,满足最容易满足的那几个人,最后剩下的是自己的
var tmpcount=this.NeedBallot;
tmp=GoldCount;
for(i=0;i<TreatResult.length;++i)
{
if(tmpcount>0)
{//满足所需票数的几个人,从总金币数中减去他们分得的金币
tmp-=Pirate[TreatResult[i]].MaxGold;
tmpcount--;
}
else
{//剩下的人部分给金币
Pirate[TreatResult[i]].MaxGold=0;
}
}
this.MaxGold=tmp;//剩下的是自己的
if(tmp<0)return 0;//如果自己的是负值,显然就得不到足够的票数保命
else
{//此时至少自己不会死了
for(i=this.ID;i<=PirateCount;++i)
{
Pirate[i].Finale=Pirate[i].MaxGold;
}
}
return 1;
}
//-->
</SCRIPT>
<!-- ---------------------------以下为进度条----------------------------------- -->
<SCRIPT LANGUAGE="JavaScript">
<!--ProgressBar 1.0 llrock.myrice.com
function TProgressBar(idstr,x,y,w,h,c,bgc,max,min)
{
if(!idstr)return alert("I wanna a Name!");
else this.idstr=idstr;
this.obj=null;
this.min=min||0;
this.max=max||100;
this.x=x||100;
this.y=y||100;
this.width=w||204;
this.height=h||24;
this.color=c||"#FF6600";
this.bgcolor=bgc||"#E1E1E1";
this.pos=0;
this.percent=0;
this.Create=TProgressBar_Create;
this.Update=TProgressBar_Update;
this.Reposition=TProgressBar_Reposition;
}
function TProgressBar_Update()
{
this.percent=Math.floor(this.pos/this.max*100);
if(this.percent>=100)
{
this.percent=100;
this.obj.width=this.width-4;
}
else
{
this.obj.width=Math.floor(this.pos/this.max*(this.width-4));
}
this.counter.innerHTML=String(this.percent)+"%";
}
function TProgressBar_Create()
{
var str="";
str+='<div id="'+this.idstr+'_border" style="position:absolute; left:'+this.x+'px; top:'+this.y+'px; width:'+this.width+'px; height:'+this.height+'px; z-index:1; background-color: #000000;">';
str+='<div id="'+this.idstr+'_bg" style="position:absolute; left:1px;top:1px;width:'+(this.width-2)+'px; height:'+(this.height-2)+'px; z-index:2; background-color: '+this.bgcolor+';">';
str+='<div id="'+this.idstr+'_main" style="position:absolute; left:1px; top:1px; width:1px; height:'+(this.height-4)+'px; z-index:3; background-color: '+this.color+';font-size:1px"></div>';
str+='<div id="'+this.idstr+'_counter" style="position:absolute;width:10px;height:'+(this.height-4)+'px;left:'+(this.width/2-10)+'px;top:1px;z-index:3">0%</div>';
str+='</div></div>';
document.write(str);
this.obj=document.all[this.idstr+"_main"].style;
this.counter=document.all[this.idstr+"_counter"];
}
function TProgressBar_Reposition()
{
this.pos=0;
//this.max=100;
this.Update();
}
var PB1=new TProgressBar("myPB1",100,5)
PB1.Create()
var PB2=new TProgressBar("myPB2",100,40,null,null,"#99FF00")
PB2.Create()
//-->
</SCRIPT>
</BODY>
</HTML>
meizz(梅花雨) jamwaychen(凌凌漆) 谢谢你们的宽慰,我还好谢谢了。
2: x x x 100 0
3: x x 99 1 0
这里出错,后面就不用说了
第一个无所谓,反正都是0,宁杀,反对
第二个人也不同意,因为杀了下轮可以得到100如果>0.5
1: x x x x 100
2: x x x ? ?
必死,因为第一个都反对,失败所以支持第三个的分法
3: x x 100 0 0
自己的票+第二个人的票=2>1.5,成功所以反对第四个的分法
4: x 98 0 1 1
自己的票+后二个人的票=3>2,成功所以反对第五个的分法
5: 97 0 1 2 0
或 97 0 1 0 2
自己的票+后二个人的票=3>2.5,成功所以反对第六个的分法
.......
找到我的错误了,因为我值从倒数第3人开始,所以得出了错误答案,修正了一下,=50% 使用49.999999999999999999999测试得到了98 0 1 0 1,〉50%使用50 得到了 97 0 1 0 2,都正确了,但是对于500个海盗500格金币=50%的情况我还是得不到有人必死的答案,不知道为何。
=====================================================================
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD><BODY>
计算主进度:<BR><BR>
显示进度:<BR><BR>
<BR>
海盗数<input ID=Pirate_Count value=5>
金币数<input ID=Gold_Count value=100>
表决通过率大于<input ID=Pass_Percent value="50" >(对于等于50,使用49.9...,)
<input type=button value="计算" onclick="Start()">(参数过大计算时间会比较长)
<HR>
<BR>
<span ID=ResultPanel>...</span>
<SCRIPT LANGUAGE="JavaScript">
<!--
var PirateCount,GoldCount,PassPercent,Pirate;
var PID;
var DispStr="";function Start(){
//初始化条件
if(isNaN(Pirate_Count.value))return alert("请输入数字")
else PirateCount=Pirate_Count.value;
if(isNaN(Gold_Count.value))return alert("请输入数字")
else GoldCount=Gold_Count.value;
if(Pass_Percent.value>100||Pass_Percent.value<0||isNaN(Pass_Percent.value)||Pass_Percent.value=="")return alert("请输入0-100的数字")
else PassPercent=Pass_Percent.value/100;
//创建海盗对象集合,为了方便从1开始
Pirate=new Array();
for(i=1;i<=PirateCount;++i)
Pirate[i]=new TPirate(i);
//初始化进度条
var num=Math.floor(1/(1-PassPercent))+1
PID=(PirateCount-num+1);
//Pirate[PID+1].MaxGold=GoldCount; PB1.Reposition();
PB2.Reposition();
PB1.max=PID;
ResultPanel.innerHTML="正在计算,请稍等...";
DispStr="";
Caculate();
}function OutPut()
{
if(PID>PirateCount)
{
return ResultPanel.innerHTML="海盗数:"+PirateCount+"| 金币数:"+GoldCount+"| 通过率:"+(PassPercent*100)+"%<BR>"+DispStr;
}
DispStr+="Pirate"+Pirate[PID].ID+" : "+Pirate[PID].Finale+"<BR>";
PID++;
PB2.pos++;
PB2.Update();
setTimeout("OutPut()",5);
}function Caculate()
{
//从盗数第三个人开始提议,因为不可能低于这个值
if(PID<1)
{ PID=1;
PB2.max=PirateCount;
ResultPanel.innerHTML="计算结束,正在显示,请稍等...";
OutPut();
OutPut();
PB1.pos=PB1.max;
PB1.Update();
return 0;
}
var TreatResult=new Array();
var AllotResult;
CurPirate=Pirate[PID];//当前提议的海盗 //从下一个海盗开始依次听取他们的要求
for(VisitedID=PID+1;VisitedID<=PirateCount;VisitedID++)
{
Pirate[VisitedID].Treat();
TreatResult.push(VisitedID);//纪录提出了要求的人
//把访问过的海盗ID根据所要金币数从小到大排序,相等根据ID序号排序
var tmpind=TreatResult.length-1;
for(i=TreatResult.length-2;i>=0;--i)
{
if(Pirate[TreatResult[tmpind]].MaxGold<Pirate[TreatResult[i]].MaxGold)
{
var tmp=TreatResult[tmpind];
TreatResult[tmpind]=TreatResult[i];
TreatResult[i]=tmp;
tmpind=i;
}else break;//不需要排序直接结束排序
}
}
if(!Pirate[PID].Allot(TreatResult))
{
PID=1;
ResultPanel.innerHTML="计算结束,正在显示,请稍等...";
PB2.max=PirateCount;
OutPut();
PB1.pos=PB1.max;
PB1.Update();
return 0; }
PID--;
PB1.pos++;
PB1.Update();
setTimeout("Caculate()",5)
return 0;
}//------------------------------------------------------------
// 海盗类
//
//------------------------------------------------------------
function TPirate(ID)
{
this.ID=ID;//海盗编号从1开始
this.MaxGold=0;//每次向提议者索要的金币数
this.Finale="被投进大海喂鱼了!";//最终分配到的金币数,如果始终没有分配过,说明必死无疑
var count=PirateCount-ID+1;//包括自己在内或者的人数 this.NeedBallot=Math.floor(count*PassPercent);//需要获得的票数,不包括自己投自己的一票 this.Treat=TPirate_Treat;
this.Allot=TPirate_Allot;
}
//--------------------------------------------------------
//每次当有人提出分配方案时,根据自己的情况向提出者勒索
function TPirate_Treat(TargetID)
{//向提出分配方案的人说:"因为你死了他可以给我MaxGold这个数目,所以你必须多给我一块金币,否则我不会投票"
this.MaxGold++;
return this.ID
}
//---------------------------------------------------------
//每次轮到自己提出分配方案时,根据别人的要求分配金币
function TPirate_Allot(TreatResult)
{//根据其他人的要求分配,满足最容易满足的那几个人,最后剩下的是自己的
var tmpcount=this.NeedBallot;
tmp=GoldCount;
for(i=0;i<TreatResult.length;++i)
{
if(tmpcount>0)
{//满足所需票数的几个人,从总金币数中减去他们分得的金币
tmp-=Pirate[TreatResult[i]].MaxGold;
tmpcount--;
}
else
{//剩下的人部分给金币
Pirate[TreatResult[i]].MaxGold=0;
}
}
this.MaxGold=tmp;//剩下的是自己的
if(tmp<0)return 0;//如果自己的是负值,显然就得不到足够的票数保命
else
{//此时至少自己不会死了
for(i=this.ID;i<=PirateCount;++i)
{
Pirate[i].Finale=Pirate[i].MaxGold;
}
}
return 1;
}
//-->
</SCRIPT>
<!-- ---------------------------以下为进度条----------------------------------- -->
<SCRIPT LANGUAGE="JavaScript">
<!--ProgressBar 1.0 llrock.myrice.com
function TProgressBar(idstr,x,y,w,h,c,bgc,max,min)
{
if(!idstr)return alert("I wanna a Name!");
else this.idstr=idstr;
this.obj=null;
this.min=min||0;
this.max=max||100;
this.x=x||100;
this.y=y||100;
this.width=w||204;
this.height=h||24;
this.color=c||"#FF6600";
this.bgcolor=bgc||"#E1E1E1";
this.pos=0;
this.percent=0;
this.Create=TProgressBar_Create;
this.Update=TProgressBar_Update;
this.Reposition=TProgressBar_Reposition;
}
function TProgressBar_Update()
{
this.percent=Math.floor(this.pos/this.max*100);
if(isNaN(this.percent))this.percent=100;//
if(this.percent>=100)
{
this.percent=100;
this.obj.width=this.width-4;
}
else
{
this.obj.width=Math.floor(this.pos/this.max*(this.width-4));
}
this.counter.innerHTML=String(this.percent)+"%";
}
function TProgressBar_Create()
{
var str="";
str+='<div id="'+this.idstr+'_border" style="position:absolute; left:'+this.x+'px; top:'+this.y+'px; width:'+this.width+'px; height:'+this.height+'px; z-index:1; background-color: #000000;">';
str+='<div id="'+this.idstr+'_bg" style="position:absolute; left:1px;top:1px;width:'+(this.width-2)+'px; height:'+(this.height-2)+'px; z-index:2; background-color: '+this.bgcolor+';">';
str+='<div id="'+this.idstr+'_main" style="position:absolute; left:1px; top:1px; width:1px; height:'+(this.height-4)+'px; z-index:3; background-color: '+this.color+';font-size:1px"></div>';
str+='<div id="'+this.idstr+'_counter" style="position:absolute;width:10px;height:'+(this.height-4)+'px;left:'+(this.width/2-10)+'px;top:1px;z-index:3">0%</div>';
str+='</div></div>';
document.write(str);
this.obj=document.all[this.idstr+"_main"].style;
this.counter=document.all[this.idstr+"_counter"];
}
function TProgressBar_Reposition()
{
this.pos=0;
//this.max=100;
this.Update();
}
var PB1=new TProgressBar("myPB1",100,5)
PB1.Create()
var PB2=new TProgressBar("myPB2",100,40,null,null,"#99FF00")
PB2.Create()
//-->
</SCRIPT>
</BODY>
</HTML>
根据pass percent求出边界人数,只考虑大于这个数,因为等于的情况就用大于大于它小一点的那个数代替,求解。因为floor是直接取真数部分,所以无论1%(1-passpercent)是否等于0我都加1,就意味者必须大于那个passpercent。
可是用49.9999%还是得不到前44 个海盗死掉的结果。
var num=Math.floor(1/(1-PassPercent))+1
然后从这个边界人开始探测,直到有人死就结束探测,打印结果。
PID=(PirateCount-num+1);
1.为什么 c=i-s.length;
2.为什么 if(2*(c+1)>i){ 而不是>=
3.为什么不用 concat() 结果也一样
A:B:C:D:E
A最先分配:
情况1:97给自己,其余BCDE不同意,自己不就死了吗?
情况2:97分给BCDE里的任何一个,其余三个人会同意吗?自己也不就死了吗?说真的,如果我是BCDE里的一个,分配给我97我就不会同意。当冤大头?呵呵,没人这么笨吧?所以分配第一个是关键,他应该搞掉一个人,并且下四轮的分配里保证自己不被干掉,应该是25:25:25:25:0,这样四个人都同意。余下不同意的就喂鱼。第二轮:
ABCD重新分配:30:30:30:10
分配到10的人不同意,不同意就喂鱼,呵呵第三轮:
ABC分配:45:45:10
分配到10的人不同意,OK,喂鱼第四轮:
AB,100:0
100赢。
allforly(白衣胜血) :因为不容易,所以才有人工智能啊。好象只有提意见的才喂鱼吧?
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD><BODY>
计算主进度:<BR><BR>
显示进度:<BR><BR>
<BR>
海盗数<input ID=Pirate_Count value=500>
金币数<input ID=Gold_Count value=100>
表决通过率大于<input ID=Pass_Percent value="49.9999" >(对于等于50,使用49.9...,)
<input type=button value="计算" onclick="Start()">(计算时间与海盗数有关)
<HR>
<BR>
<span ID=stater>...</span>
<table ID=test style="border:1px solid black;width:100%">
<tr>
<td ID=col1 bgcolor="f1f1f1" width=33% valign="top"></td>
<td ID=col2 bgcolor="d1d1d1" width=33% valign="top"></td>
<td ID=col3 bgcolor="b1b1b1" width=34% valign="top"></td>
</tr>
</table>
<BR>结论:实力和机遇的化身继承财富!<SCRIPT LANGUAGE="JavaScript">
<!--
var PirateCount; //海盗人数
var GoldCount; //金币数
var PassPercent; //投票通过率var Pirate; //海盗数组var PID; //海盗ID,临时变量
var DispStr=""; //结果字符串,临时变量function Start(){
//初始化条件
if(isNaN(Pirate_Count.value))return alert("请输入数字")
else PirateCount=Pirate_Count.value;
if(isNaN(Gold_Count.value))return alert("请输入数字")
else GoldCount=Gold_Count.value;
if(Pass_Percent.value>=100||Pass_Percent.value<0||isNaN(Pass_Percent.value)||Pass_Percent.value=="")return alert("请输入0-100的数字")
else PassPercent=Pass_Percent.value/100;
//创建海盗对象集合,为了方便从1开始
Pirate=new Array();
for(i=1;i<=PirateCount;++i)
Pirate[i]=new TPirate(i); var num=Math.floor(1/(1-PassPercent))+1
PID=(PirateCount-num+1); //初始化进度条
PB1.Reposition();
PB2.Reposition();
PB1.max=PID;
document.all.stater.innerHTML="正在计算,请稍等...";
document.all.col1.innerHTML="";
document.all.col2.innerHTML="";
document.all.col3.innerHTML="";
DispStr="";
Caculate();
}
//-----------------------------------------------------------------
//打印结果
function OutPut()
{
if(PID>PirateCount)
{
stater.innerHTML="海盗数:"+PirateCount+"| 金币数:"+GoldCount+"| 通过率 > "+(PassPercent*100)+"%<BR>";
return 0;
}
//格式输出
var colcount=Math.ceil(PirateCount/3);
var str="[Pirate"+Pirate[PID].ID+"] : "
+(Pirate[PID].Death?"被投进大海喂鱼了!":Pirate[PID].Gold)+"<BR>";
if(PID<=colcount)document.all.col1.innerHTML+=str;
else if(PID>(2*colcount)) document.all.col3.innerHTML+=str;
else document.all.col2.innerHTML+=str; PID++;
PB2.pos++;
PB2.Update();
setTimeout("OutPut()",5);
}
//-----------------------------------------------------------------
//从后向前探测
function Caculate()
{
var TreatResult=new Array(); //1、从下一个海盗开始依次听取他们的要求(只是先听听他们上次分得结果)
for(VisitedID=PID+1;VisitedID<=PirateCount;VisitedID++)
{
//记录被访问过的人ID,此时先不和他们磋商,为了方便放到分配时
TreatResult.push(VisitedID);
//每访问一个人就进行一次排序,在这里排序可减少次数
//根据金币数从小到大排序,相等根据ID序号排序,
var tmpind=TreatResult.length-1;
while(tmpind>0&&Pirate[TreatResult[tmpind]].Gold<Pirate[TreatResult[tmpind-1]].Gold)
{
var tmp=TreatResult[tmpind];
TreatResult[tmpind]=TreatResult[tmpind-1];
TreatResult[tmpind-1]=tmp;
tmpind--;
}
}
//2、按照TreatResult的顺序分配并获得选票
Pirate[PID].Allot(TreatResult);
//3、探测下一个海盗得分配方案,更新进度条
PID--;
PB1.pos++;
PB1.Update();
//4、知道编号为1的海盗分配结束后,输出结果;否则继续计算
//为了避免深度的循环嵌套导致浏览器崩溃,使用settimeout,如果可以使用线程盖有多好!
if(PID<1)
{
PID=1;//PID置为零为输出结果做准备
PB2.max=PirateCount;
document.all.stater.innerHTML="计算结束,正在显示,请稍等...";
PB1.pos=PB1.max;
PB1.Update();
OutPut();
}
else
{
setTimeout("Caculate()",5)
} return 0;
}//------------------------------------------------------------
// 海盗类
//------------------------------------------------------------
function TPirate(ID)
{
this.ID=ID; //编号从1开始
this.Gold=0; //得到的金币数
this.Death=0; //0:必然死不了,有权利多要金币。1:有可能死,不会要金币就投票
var count=PirateCount-ID+1;//包括自己在内或者的人数 this.NeedBallot=Math.floor(count*PassPercent);//需要获得的票数,不包括自己投自己的一票
this.Allot=TPirate_Allot;
this.Treat=TPirate_Treat;
}
//-----------------------------------------------------------------
//当提议者开始分配时提出自己的要求
function TPirate_Treat()
{
if(this.Death)
{//如果我有可能死
this.Gold=0;//只要我免费投当前人一票,他就可以不死
this.Death=0;//因此我可以不死了
}
else
{//我肯定不死,所以我得多要1块
this.Gold++;
}
return this.Gold;
}
//-----------------------------------------------------------------
//根据别人的要求分配金币
function TPirate_Allot(TreatResult)
{
//1、首先假设可以得到足够选票,测试sumgold的符号判断自己是否可以过关
var sumgold=GoldCount;
var ballot=this.NeedBallot;
var gold,p;
var ind=0;
while(ballot>0&&ind<TreatResult.length)
{//强制测试
p=Pirate[TreatResult[ind]];
gold=p.Gold;
if(!p.Death)gold++;//如果这个人没有可能死,他的要求加1
sumgold-=gold;
ballot--;
ind++;
}
//2、根据测试结果进行真实分配
if(sumgold>=0)
{//测试结果:通过。按照他们的要求分配
this.Gold=GoldCount;
for(i=0;i<TreatResult.length;++i)
{
p=Pirate[TreatResult[i]];
//海盗开始磋商
p.Treat(); if(this.NeedBallot>0)
{//选票不够就买一张
this.Gold-=p.Gold;
this.NeedBallot--;
}
else
{//选票够了,就不分给下面的人
p.Gold=0;
}
}
}
else
{//测试结果:死。打进死牢先
this.Death=1;
this.Gold=0;
}
return 1;
}
//-->
</SCRIPT>
<!-- ---------------------------以下为进度条----------------------------------- -->
<SCRIPT LANGUAGE="JavaScript">
<!--ProgressBar 1.0 llrock.myrice.com
function TProgressBar(idstr,x,y,w,h,c,bgc,max,min)
{
if(!idstr)return alert("I wanna a Name!");
else this.idstr=idstr;
this.obj=null;
this.min=min||0;
this.max=max||100;
this.x=x||100;
this.y=y||100;
this.width=w||204;
this.height=h||24;
this.color=c||"#FF6600";
this.bgcolor=bgc||"#E1E1E1";
this.pos=0;
this.percent=0;
this.Create=TProgressBar_Create;
this.Update=TProgressBar_Update;
this.Reposition=TProgressBar_Reposition;
}
function TProgressBar_Update()
{
this.percent=Math.floor(this.pos/this.max*100);
if(isNaN(this.percent))this.percent=100;//
if(this.percent>=100)
{
this.percent=100;
this.obj.width=this.width-4;
}
else
{
this.obj.width=Math.floor(this.pos/this.max*(this.width-4));
}
this.counter.innerHTML=String(this.percent)+"%";
}
function TProgressBar_Create()
{
var str="";
str+='<div id="'+this.idstr+'_border" style="position:absolute; left:'+this.x+'px; top:'+this.y+'px; width:'+this.width+'px; height:'+this.height+'px; z-index:1; background-color: #000000;">';
str+='<div id="'+this.idstr+'_bg" style="position:absolute; left:1px;top:1px;width:'+(this.width-2)+'px; height:'+(this.height-2)+'px; z-index:2; background-color: '+this.bgcolor+';">';
str+='<div id="'+this.idstr+'_main" style="position:absolute; left:1px; top:1px; width:1px; height:'+(this.height-4)+'px; z-index:3; background-color: '+this.color+';font-size:1
你引用的那段话的结论有问题,看看我的分析,绝对不是“怯懦者继承财富”,按照她的分法是“嫉妒者没有财富”
1 2 3 4 5 6 7 8 9 10 11
----------------------------------------------------
10 | x x x x x x x x x 3 0
9 | x x x x x x x x 2 0 1
8 | x x x x x x x 2 0 1 0
7 | x x x x x x 1 0 1 0 1
5 | x x x x x 1 0 1 0 1 0
5 | x x x x 0 0 1 0 1 0 1
4 | x x x 0 1 1 0 1 0 0 0
>>>>特殊情况,3的方案不通过,活着的人没有得到期望的金子,所以他们的欲望不膨胀
3 | x x D 0 1 1 0 1 0 0 0
>>>>3活了下来,但是此时没有得到金币
2 | x 0 0 1 0 0 1 0 1 0 0
1 | 因为,2~3死不了,所以他们也会索要金币,所以死掉了所以最后进子的分配并不是按照规律性的所有奇数编号得海盗得到了金子,
不错前44个海盗不幸的死了,但是于是45—172为了保命,都没有得到金子,而是从173号海盗开始所要一块金币得人得到了金子,但并不连续。上面的那个500海盗 100金币 =50%的结论:“怯懦者继承财富”是【不正确】的。他所谓的强者都是一群小度鸡肠的人(这不是我理解的强者),嫉妒让强者没有给201后面的到金子,因为它的嫉妒心使弱者得到了金子,而他完全可以把金子给强者,自己仍就可以活命,但他的“强者”嫉妒心太强了。我的强者是理智的、心胸开阔的,我的结论是“实力和机遇的化身继承财富!”,得到财富的人不只是强者而且是幸运儿,她的幸运在于自己处于最有利的位置。所以和我一样平凡的人们,我们不是最强的,但也许我们是幸运的,所以你将拥有世界给予你的财富,好好的生活。
1.每個人都會把自己的生命看得最重要
(舉例﹕如果只有4﹑5兩人﹐4來分給5 100顆﹐5也可以反對(反對沒令5利益受損)分法而令4死﹐那么4就絕對不愿讓他來分)
2.這是一個最有爭議而又是很多人提這個題目都沒說明的﹐就是"仅当超过半数的人"是>0.5還是>=0.5﹐我看的那個貼是>=0.5
0<k<n当k分配时:k-1 ,k-2...显然知道自己最多要多少
当k+1分配时:k-1当然知道k分配时得到的数量,那么假设k+1给了k-1给了更多的(也就是+1),为什么不见好就收
所以k+1指导我了前的海岛一定会投票,除非她是傻瓜或者跟我又仇。我想剩下的36事实上可以随机分配,但是按编号分配比较公平
1、只要不是由自己分配珠宝,那么不管其他的人同意不同意分配原则,至少自己的性命没有损害,但是又不能让对方分到多的珠宝,怎么办呢?所以只有不同意任何分配方案。5个人里,自己不同意,那就占了25%的赢面,如果同意,就少25%的机会把提出分配原则的海盗喂鱼。所以,都说不同意的可能性有25%。OK?2、如果第一个分配珠宝的人是你,你怎么解决这样的情况?你怎么保留自己的性命?你要把100个珠宝分给自己?其余四个人同意么?100:0:0:0:0或者97:0:0:0:3的分配原则是谁想出来的?说大话不怕死的是吧?把你的性命放在100个珠宝上,你真的会这么分配么?你要钱不要命的?其余的分配方案先不说,楼主你说话太高深了,327、326什么的,qiushuiwuhen(秋水无恨),你的426是什么跟什么?问你们一个非常简单的问题:你来分配第一轮珠宝,你怎么做?total = 5;//海盗总数
var haidao = new Array(total)
for (var i=0;i<haidao.length;i++){
if (i=haidao.length-1) alert("抽到第"+(haidao.length-1)+"签的人获取全部珠宝,谢谢,游戏结束!")
}