|
newkid 发表于 2012-3-31 23:26 ![]()
TNB终于出手了!
你这3,4有问题,因为我们得保证第三步中每次回来的都是最快、次快这两人中的一个。
恩,写的粗糙了。 中间漏后续把最小的再送过去的步骤。
实际上,这个算法的思路是,保证每次时间最慢的人尽量多的在一起过去, 而时间快的人只是起摆渡作用而已, 而摆渡工作只需要2人足以(假设为t1,t2), 但为了保证往返次数最少,在t1/t2过去时,可让除t1/t2外最快的人(t3,t4....)跟着过去 。
修正一下:
设人数M, 容量为N,最快的两个人为t1/t2
1.先计算Mod(M-1, N-1),
2.如果为余数为0, 则第一次装最小的N个人(t1,t2, .. tN)
如果不为0, 则装最小的"余数+1"个人 (t1,t2,.. t(余数+1))
3. 让对岸最小的回来(t1)
4. 最大的N个人过去
5. 让对岸最小的回来(t2)
6. 最小的N个人过去(t1,t2, ....)
.....
循环3..6
这样,t1和t2就有了明确分工: t1回来是为了让最慢的过河, t2回来则是为了把t1带过去。
这里有一个问题就是, 要不要让t3以及t3以后的人充当摆渡人? 如果t3也可负责摆渡,那么第6步可改成还是最慢的N个人过去,然后t3回来接应t1/t2. 这样的方案是否一定比上面的慢? 不好证明。或者说不同的具体数值会产生不同的最优方案?
比如说t1,t2,t3分别是1, 1.01, 1.02, 而t4以上都很大, 那么也许t3也负责摆渡效果会很好?
|
|