楼主: newkid

[精华] 趣味SQL:微软面试题:过河

[复制链接]
论坛徽章:
0
81#
发表于 2012-3-31 19:47 | 只看该作者

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
82#
 楼主| 发表于 2012-3-31 23:26 | 只看该作者
tree_new_bee 发表于 2012-3-31 16:22
上面的算法也许应该这样:
设人数M, 容量为N
1.先计算Mod(M-1, N-1),

TNB终于出手了!
你这3,4有问题,因为我们得保证第三步中每次回来的都是最快、次快这两人中的一个。

我在试图模拟56楼的步骤时有个意外收获,因为递归WITH是不允许用分析函数的,所以找下一步的TOP N记录就成了障碍,后来用其他办法绕了过去。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
83#
发表于 2012-4-1 04:20 | 只看该作者
newkid 发表于 2012-3-30 04:15
N个人的做法,按照二进制位的思路也很容易写出来。

56楼的算法,碰到容量为3的就不符合了:

4个人,3个人可同时过,应最快的2个先过,最快的1个回来,然后剩下的全过去(耗时:t2+t1+t4)
5个人,3个人可同时过,应最快的3个先过,最快的1个回来,然后剩下的全过去(耗时:t3+t1+t5)
6个人,3个人可同时过,则应最快的2个先过,最快的1个回来,最慢的三个过去,次快的回来,最快的三个一起过去(耗时:t2+t1+t6+t2+t3)。当然,最快的3个先过,得到的时长是一样的

大致推测一下,首先要使来回的次数最少,然后在来回次数最少的里选择一个最优的方案,即应得到所求
假设有M个人,每次最多N个人可同时过桥,则最少来回次数为:
TURN:=ceil((M+ceil(M/N)-1)/N)

暂时想到这里。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
84#
发表于 2012-4-1 04:23 | 只看该作者
changhe325 发表于 2012-3-29 19:33
从网上搜了一个结论:
1.过河时间最短的和次数最短的人先过。2.在已过的人中最短时间的人返回。3.过河时间 ...

前一段跟我43楼的演算思路没啥差别
后一段我认为不对,详见我在83楼的分析

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
85#
 楼主| 发表于 2012-4-1 05:31 | 只看该作者
看来答案已经呼之欲出了。
回程必在最快的两人之中,这个没有疑问;
过去的时候,奇数次选最快的X人(X=2..N之间),偶数次选最慢的N人。
现在问题是怎么确定这个X。

使用道具 举报

回复
论坛徽章:
10
CTO参与奖
日期:2009-02-20 09:44:20ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30迷宫蛋
日期:2012-05-07 10:55:58茶鸡蛋
日期:2012-04-19 16:08:262012新春纪念徽章
日期:2012-01-04 11:54:462011新春纪念徽章
日期:2011-01-04 10:24:02数据库板块每日发贴之星
日期:2010-12-19 01:01:02数据库板块每日发贴之星
日期:2010-12-13 01:01:012009日食纪念
日期:2009-07-22 09:30:00优秀写手
日期:2014-02-08 06:00:12
86#
发表于 2012-4-1 08:47 | 只看该作者
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也负责摆渡效果会很好?

使用道具 举报

回复
求职 : 数据库开发
论坛徽章:
10
茶鸡蛋
日期:2012-04-19 16:08:35美羊羊
日期:2015-03-24 15:03:142015年新春福章
日期:2015-03-06 11:58:392015年新春福章
日期:2015-03-04 14:53:16马上有对象
日期:2014-08-15 13:23:54优秀写手
日期:2014-08-15 06:00:13马上加薪
日期:2014-08-14 22:48:12马上有房
日期:2014-09-04 07:54:53ITPUB 11周年纪念徽章
日期:2012-10-09 18:14:482015年新春福章
日期:2015-03-30 14:49:43
87#
发表于 2012-4-1 09:18 | 只看该作者
63楼写的
各位给个评价啊~

使用道具 举报

回复
求职 : 数据库开发
论坛徽章:
10
茶鸡蛋
日期:2012-04-19 16:08:35美羊羊
日期:2015-03-24 15:03:142015年新春福章
日期:2015-03-06 11:58:392015年新春福章
日期:2015-03-04 14:53:16马上有对象
日期:2014-08-15 13:23:54优秀写手
日期:2014-08-15 06:00:13马上加薪
日期:2014-08-14 22:48:12马上有房
日期:2014-09-04 07:54:53ITPUB 11周年纪念徽章
日期:2012-10-09 18:14:482015年新春福章
日期:2015-03-30 14:49:43
88#
发表于 2012-4-1 09:55 | 只看该作者
本帖最后由 jixch 于 2012-4-1 10:01 编辑

我发现了我写的有问题
86楼的貌似也有问题....
就像最后的:t1,t2,t3分别是1, 1.01, 1.02, 而t4以上都很大, 那么也许t3负责摆渡效果确实会更好
看来要么循环过程要加数据大小判断
再要么就只能具体情况具体分析了....

使用道具 举报

回复
论坛徽章:
2
2011新春纪念徽章
日期:2011-02-18 11:43:34ITPUB十周年纪念徽章
日期:2011-11-01 16:25:22
89#
发表于 2012-4-1 10:01 | 只看该作者
不错哦,一般人单纯的想法,就是 19分钟的那种。o(∩_∩)o 哈哈,有点脑筋急转弯的感觉

使用道具 举报

回复
论坛徽章:
0
90#
发表于 2012-4-1 10:24 | 只看该作者
回帖给我看到非常多的乐趣啊!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表