A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© GKAirzzzzz 中级黑马   /  2017-2-18 22:11  /  1028 人查看  /  7 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

5个海盗抢得100枚金币,他们按抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,超过半数同意方案才被通过,否则他将被扔入大海喂鲨鱼,依此类推。假定每个海盗都是绝顶聪明且很理智,那么第一个海盗提出怎样的分配方案才能够使自己的收益最大化?

7 个回复

倒序浏览
这个题懒得贴答案了,就是倒着推算,具体感兴趣的可以百度~~
然后今天的问题,很简单,如何不借助第三个变量,交换两个变量的值~
回复 使用道具 举报
本帖最后由 GKAirzzzzz 于 2017-2-22 20:32 编辑

F1:算数运算
x=x+y; //x暂存两数之和
y=x-y; //y为两数之和减去y,即原来的x
x=x-y; //x为两数之和减去现在的y(原来的x),变成原来的y
这种方法存在整数溢出的可能
F2:异或
x^=y;//x先存x和y两者的信息
y^=x;//保持x不变,利用x异或反转y的原始值使其等于x的原始值
x^=y;//保持y不变,利用x异或反转y的原始值使其等于y的原始值
原文:http://blog.csdn.net/samjustin1/article/details/52138733
如果仔细思考,可以发现实际上有无数种方法。为什么需要第三个变量?从信息的角度来分析,两个变量必然存在两份信息(姑且以份为单位),如果直接交换,a=b,则a原来的信息丢失,所以引入一个临时变量来保存a的信息,以确保信息完整性。也就是说,temp的作用就是保存交换过程可能损失的信息量,那么只要这个信息量不损失,则无需temp.做编解码的人都知道,编码的是残差数据。残差数据包含的就是那额外的信息量。那么,完全可以在交换过程中传递额外信息,也就是a,b之间的耦合信息,则交换过程不会发生信息丢失,也就无需第三个变量。这耦合信息可以是a-b,也可以是a^b,还可以是a*b.如:
a=a*b;
b=a/b;
a=a/b;
同样可以完成交换(仅提供思路,未考虑除0溢出等问题)。举一反三,可以有无穷种方法,但原理都是一样的。
原文:http://blog.chinaunix.net/uid-17053077-id-1987964.html


点评

顺带提醒一下,这只是思维题。交换两个变量的值,不借助第三个变量,虽然节省了一个存储空间,但失去了可读性,是不可取的。  发表于 2017-2-22 20:59
谢谢提醒,我改一下  发表于 2017-2-22 20:31
文章最后的 a=a*b;...........(1) a=a/b;...........(2) b=a/b;...........(3) 我觉得(2)和(3)的顺序应该交换一下  发表于 2017-2-22 12:54
回复 使用道具 举报
今天总算记得找东西了。。然后拖更了好几天,先放两道题。
1. M张卡片的背面分别写有M个不同的数,每一次提问可任选三张不同的卡片,询问写在它们背面的三个不同的数组成的集合。问:最少可以通过多少次询问能了解每张卡片背面写的数是什么
2.由1到100的所有整数被写成一行a[sub]1[/sub],a[sub]2[/sub],....a[sub]100[/sub],但顺序未知。通过每个50个数的问题,可以弄清楚这50个数中各个数的大小顺序,问最少需问多少个这样的问题,才能确保弄清楚所有100个数?

回复 使用道具 举报
1111111111
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马