分赃最优策略

题目来自于:https://www.acmcoder.com/#/practice/code

题目描述:

小明和n个人发现了一个宝藏,里面有m个宝石。为了分赃。大家决定采用一种方式分赃,分赃的方式如下:

1)每个人由抽签决定了自己的号码(1,2,3…n+1)。

2)由n+1号提出分配方案,然后大家表决,当且仅当超过半数的人同意时(包括他自己),按照他的方案进行分配,否则这个人将被杀死。

3)n+1号死后,由n号接替n+1号对剩下的人提出分配方案,类似2步骤。以此类推。

大家都有如下的几个性格特点:

1)足智多谋,总是采取最优策略。 2)贪生怕死,尽量保全自己性命。

3)贪得无厌,希望自己得到越多宝石越好 4)心狠手辣,在自己利益最大的情况想希望越多人死越好。

5)疑心多虑,不信任彼此,尽量确保自身利益不寄希望与别人给自己更大利益。

不知道是不幸还是幸运,小明抽到了n+1号签,意味着他将第一个提出分配方案。他想请教机智的你,他能否活下来,如果能又将获得最多多少个宝石?

输入描述

两个整数n,m,分别表示n个人和m个宝石(2=<m<=100,1<=n<=2*m-2)。

输出描述

如果小明能活下来输出一个整数x表示小明最多获得的宝石数,否则输出-1。

样例输入

4 100

样例输出

97

提示

分配方案 0 2 1 0 97 或2 0 1 0 97(从1号到5号)。

看不明白题,然后去网上找的解析:

  • 要回答这个问题,一般人肯定会想到,5号必须先让另外两个人同意,所以,他可以自己得到32颗,而给4号3号各34颗。但只要仔细想想,就会发现不可能,4号和3号有积极性让5号死,以便自己得到更多。所以,5号无奈之下,可能只有自己得0,而给4和3各50颗。但事实证明,这种做法依然不可行。为什么呢?

  • 因为我们要先看1号和2号的反应才行。很显然,如果最后只剩下1和2,这无论2提出怎样的方案,1号都会坚决反对。即使2号提出自己要0,而把 100颗钻石都给1,1也不会答应――因为1号愿意看到2号死掉。这样,1号最后顺利得到100颗钻石——因此,2的方案绝对无法获得半数以上通过,如果轮到2号分配,2号只有死!

  • 由此可见,2号绝对不会允许自己来分。他注定是一个弱者中的弱者,他必须同意3号的任何方案!或者4号5号的合理方案。可见,如果4号5号死掉了, 轮到3号分,3号可以说:我自己100颗,1号2号0颗,同意的请举手!这时候,2号为了不死,只好举手,而1号暴跳如雷地反对,但是没有用。因为3个人 里面有2个人同意啊,通过率66.7%,大于50%!

  • 由此可见,当轮到3号分配的时候,他自己100颗,1和2都是0。因此,1和2不会允许轮到3来分。如果4号能够给1和2一些利益,他们是会同意的。

  • 比如4的分配方案是:1,1,0,98,那么,3的反对无效。1和2都能得到1,比3号来分配的时候只能得到0要好得多,所以他们不得不同意。

  • 由此看来,4号的最大利益是98。5号要收买4号,是不可能的。在这种情况下,5号可以给1号和2号每人2颗,自己收买他们。这样,4号和3号反对是无效的。因此,5号的一种分配方案是:2,2,0,0,96。

  • 这是不是最佳方案呢?再想一想,5号也可以不给1号和2号各2个,而只需要1个就搞定了3号,因为如果轮到4号来分配,4号是可以不给3号的,3号的得益只有0。所以,能得到1个,3号也该很满意了。所以,最后的解应该是:0,2,1,0,97。

  • 好,再倒推。假设5号提出了2,0,1,0,97的方案,5号自己赞成。2和4反对。3∶2,关键就在于3号和1号会不会反对。假设3号反对,杀掉 5号,4号来分配,3自己只能得到0。显然,3号不划算,他不会反对。如果1号反对,轮到2号、3号、4号来分配,1号自己最多只能得到1。

  • 所以,3号和1号与其各得到0和1,还不如现在的1和2。

  • 最佳答案应该是:5号分配,依次是:0,2,1,0,97; 或者是:2,0,1,0,97。

分析不出规律,接着继续推算一下

1 [100]
2 [0,100]
3 [0,0,100]
4 [1,1,0,98]
5 [0,2,1,0,97][2,0,1,0,97]
//6号需要得到3个人的支持,首先是4号给他1个即可,其次有2种方案;
//其一给3号2个,最后一个在1和2中选1个,5号给1或2的是2个,但是是不确定给1还是2的,所以获得1或2的支持,需要给他2个即可
//其二给1和2各2个,3号0个
6 [2,0,2,1,0,95][0,2,2,1,0,95][2,2,0,1,0,95]
//7号需要得到3个人的支持,首先是5号给他1个即可,其次有6种方案:
//1234号取2人各给2个即可,同样因为5,6号分配的不确定性,所以给2即可
7 [2,2,0,0,1,0,95][2,0,2,0,1,0,95][2,0,0,2,1,0,95][0,2,2,0,1,0,95][0,2,0,2,1,0,95][0,0,2,2,1,0,95]

规律总结有点思绪了
从5号开始,作为n+1号,放弃n号给他0个,获取n-1号的支持给他1个,在0~n-2之间找 Math.ceil(n/2)-1 个分别给2即可

var printOut = function(arr){
  let [n,m] = arr
  let flag = -1;
  let count = Math.ceil(n/2)-1
  switch(n+1){
  	case 1: flag=m; break;
  	case 2: flag=-1; break;
  	case 3: flag=m; break;
  	case 4: flag=m-2; break;
  	default: flag = (m-2*count-1)>=0?(m-2*count-1):-1; 
  }
  console.log(flag)
}
printOut([4,100])

结果:

//printOut([4,100])
97
//printOut([5,100])
95
//printOut([6,100])
95
//printOut([6,5])
0
//printOut([6,4])
-1
//printOut([5,4])
-1
//printOut([4,4])
1
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值