奉献给大家
/////////////////////////////////////////////////////////////
12个球有一个球重量不一样,称三次找出
12个球编号1~12,设不同的球为x,第一次分成3组,每组4个
一、1,2,3,4 = 5,6,7,8 则x在9~12中
(一)9=10,则x在11、12中
(1)9=11--> x=12
(2)9>11 or 9<11 --> x=11
(二)9>10,则x在9、10中
(1) 9=11 --> x=10
(2) 9>11 or 9<11 --> x=9
(三)9<10, 则x在9、10中
(1) 9=11 --> x=10
(2) 9>11 or 9<11 --> x=9
二、1,2,3,4 > 5,6,7,8 则x在1~8中
(一) 1,2,6,7 = 8,9,10,11 则x在3、4、5中
(1) 3=4 --> x=5
(2) 3>4 --> x=3
(3) 3<4 --> x=4
(二) 1,2,6,7 > 8,9,10,11 则x在1、2、8中,如果异常球重的话,肯定是在1或2;如果异常球轻的话,肯定是8,故在1、2、8中
(1) 1=2 --> x=8
(2) 1>2 --> x=1
(3) 1<2 --> x=2
(三) 1,2,6,7 < 8,9,10,11 则x在6、7中
(1) 1=6 --> x=7
(2) 1>6 or 1<6 --> x=6
三、1,2,3,4 < 5,6,7,8 则x在1~8中
(一) 1,2,6,7 = 8,9,10,11 则x在3、4、5中
(1) 3=4 --> x=5
(2) 3>4 --> x=4
(3) 3<4 --> x=3
(二) 1,2,6,7 > 8,9,10,11 则x在6、7中
(1) 1=6 --> x=7
(2) 1>6 or 1<6 --> x=6
(三) 1,2,6,7 < 8,9,10,11 则x在1、2、8中
(1) 1=2 --> x=8
(2) 1>2 --> x=2
(3) 1<2 --> x=1
///////////////////////////////////////////////////////
一随机数以概率 p 生成0,以概率(1-p)生成1,怎样生成等概率的 0 和 1 ?
这涉及到概率 分布的内容了,其实也简单只要能找到一个概率为1/2p的函数就解决了.
另外还有一个比较方便的实现:
一随机数f(x)以概率 p 生成0,
那么设g(x)=f(x)>0?0:1; 刚g(x)以概率 1-p 生成0.
所以f(x),g(x)同时生成0的概率为p(1-p)等于同时生成1的概率.
得等概率随机数
function g(x){
int v=f(x)+g(x);
if(v==0){
return 0; //1.f(x)g(x)同时为0
else if(v==2){
return 1; //2.f(x)g(x)同时为1
}else{
g(x); //3.f(x)g(x)一个为0一个为1,重新生成随机数
}
}
上面第3步的概率为p^2+(1-p)^2
////////////////////////////////////////////////////////////////////////////
有101个硬币,100个真的,1个假的,形状相同,重量不一样,用无码天秤称,称两次,假币重还是真币重?
把101个硬币平均分成三份,分别是:33,33,34,把两 堆33个放在天平上称,
1、如果平衡,说明这66个都是真的。然后从这两堆共66个中取出34个,与第三堆的34个分别放在天平的左右盘中称,这样,第三堆所在的天平的那一端的轻重就是假币的轻重情况。
2、如果两 个33放在天平上不平衡,说明第三堆的34个是真的。取下轻的一端的33个,从第三堆中取33个放在上面,如果平衡,说明取下的一堆中有假币,假币比真的轻。如果不平衡,只有一种结果,第三堆与取下的一堆一样,都比那一堆轻,说明假的比真的重。
/////////////////////////////////////////////////////////////////////
一串长为M的珠子,珠子的颜色有N种(N<10)。求包含N种颜色的最短连续珠串。
两个指针,开始的时候都指向某一个位置,移动前一个指针,直到两个指针直接包含了所有颜色的珠子。
此时记下len。
然后向前移动后面的指针,再调整最前面的指针,直到重新满足两个指针间包含了所有的颜色,比较此时的len和之前的len,取最小值。
如此移动(移动后面的指针,再调整最前面的指针),直到后面的指针回到起始位置。
时间复杂度是O(M),空间复杂度是O(1)