SQL趣题:四人过桥的问题

传说中的微软面试题:
有一群人A,B,C,D (人数>=2)要在夜里走过独木桥过河,他们只有一把手电筒。四个人的速度不同,
过河分别需要1,2,5,10分钟,桥上最多走两个人,两个人一起走时按速度慢的计算。过河一定要用手电筒。
请问最快的方法是如何安排,需要几分钟?
例子输出:
A B,A,A C,A,A D  19
表示:
A B 过去 2 分钟
A   返回 1 分钟
A C 过去 5 分钟
A   返回 1 分钟
A D 过去 10 分钟
这个例子总共用19分钟。
CREATE TABLE bridge_crossing (
       name  VARCHAR2(10) PRIMARY KEY
      ,time  NUMBER
      );
     
INSERT INTO bridge_crossing VALUES ('A', 1);
INSERT INTO bridge_crossing VALUES ('B', 2);
INSERT INTO bridge_crossing VALUES ('C', 5);
INSERT INTO bridge_crossing VALUES ('D', 10);
COMMIT;

以下是我的实现方法:
SQL> set timing on;
SQL> with t as
  2  (select rownum rn,t.name,t.time from bridge_crossing t),
  3  tt as (select t1.name n1,t2.name n2,t3.name n3,t4.name n4,t5.name n5,t6.name n6,
  4  t1.time time1,t2.time time2,t3.time time3,t4.time time4,t5.time time5,t6.time time6,
  5  greatest(t1.time,t2.time)+least(t1.time,t2.time)+
  6  greatest(t3.time,t4.time)+
  7  least(greatest(t1.time,t2.time),t3.time,t4.time)+
  8  greatest(t5.time,t6.time) sum_time
  9  from t t1,t t2,t t3,t t4,t t5,t t6
10  where t1.name<>t2.name and t3.name<>t4.name and t5.name<>t6.name
11  and t1.rn12  and instr(t1.name||t2.name||t3.name||t4.name||t5.name||t6.name,'A',1,1)>0
13  and instr(t1.name||t2.name||t3.name||t4.name||t5.name||t6.name,'B',1,1)>0
14  and instr(t1.name||t2.name||t3.name||t4.name||t5.name||t6.name,'C',1,1)>0
15  and instr(t1.name||t2.name||t3.name||t4.name||t5.name||t6.name,'D',1,1)>0
16  and t1.name||t2.name<>t3.name||t4.name
17  and t3.name||t4.name<>t5.name||t6.name),
18  ttt as (select min(sum_time) min_time from tt)
19  select n1,n2,n3,n4,n5,n6,sum_time from tt,ttt where tt.sum_time=ttt.min_time
20  /
N1         N2         N3         N4         N5         N6           SUM_TIME
---------- ---------- ---------- ---------- ---------- ---------- ----------
A          B          C          D          A          B                  17
已用时间:  00: 00: 00.09
SQL>

点评:虽然这种方法有局限性,但思路还是可以的,至少能将最佳结果过滤出来!
 
 
 
 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26977915/viewspace-733824/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26977915/viewspace-733824/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值