可以证明emacsnw的方法是正确的,而且if(wcurrent>1) wcurrent = 1;这一句也的确可以去掉.
设序列为
p...pN1p...pN2p...pNkp....p
其中p表示正数,Ni表示负数,min{Ni}表示到Ni为止(包括Ni)乘积中最小的, 而max{Ni}为最大的,以下用归纳法证明bcurrent=max{Ni}, wcurrent=min{Ni};
(1)经过第一个负数N1时,bcurrent<0, wcurrent<0, 而且bcurrent=min{N1}, 交换后,wcurrent=min{N1},而bcurrent=1,成立
(2)设经过第i-1个负数Ni-1后, bcurrent=max{Ni-1}, wcurrent=min{Ni-1}, 队列为:
....Ni-1p....PNip....
则在经过Ni前, bcurrent=max{P},wcurrent是连乘积<0,经过Ni后
bcurrent=min{Ni}<0, wcurrent>0, 又因为Ni<0,所以包括Ni的乘积要大于0,必然要包括Ni-1,也就是要包括Ni-1到Ni之间的所有正数,而在经过Ni-1后,wcurrent=min{Ni-1},所以经过Ni后wcurrent=max{Ni}>0,交换后得到bcurrent=max{Ni}, wcurrent=min{Ni},于是得证 |