楼主: 〇〇

[精华] ACM题(#2634 Collecting Stones)

[复制链接]
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
81#
 楼主| 发表于 2011-4-12 18:05 | 只看该作者
原帖由 rollingpig 于 2011-4-12 17:33 发表
and t.c
and t.c5
==>
and t.c>=4

后来想到了,漏算了4,5列上下移动的

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
82#
 楼主| 发表于 2011-4-12 18:14 | 只看该作者
用上79 80

1948=〉
SQL> @c:\downloads\26345rp

T.PATH||'*'||T2.PATH
------------------------------------------------------------------------------------------------------------------------------------------------------
,01,09,17,25,33,41,49,57,58,50,59,51,43,35,27,19,11,03,04,12,20,28,36,44,52,60*61,53,45,37,29,21,13,05,06,14,22,30,38,46,54,62,63,55,47,39,31,23,15,07
,08,16,24,32,40,48,56,64,

已用时间:  00: 00: 21.80

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
83#
 楼主| 发表于 2011-4-12 21:51 | 只看该作者
递归写法不能在拼路径的时候把起点到当前点的石头相同的不同路径剪掉,所以慢了

使用道具 举报

回复
论坛徽章:
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
84#
发表于 2011-4-12 21:59 | 只看该作者
原帖由 〇〇 于 2011-4-12 21:51 发表
递归写法不能在拼路径的时候把起点到当前点的石头相同的不同路径剪掉,所以慢了

我昨天在翻译lugionline同学的MSSQL的时候看到MSSQL居然支持在递归的地方使用ROW_NUMBER().
ORACLE这个递归还有很多可以改善的地方,比如增加聚合、分析函数,增加对子查询的支持,丢弃中间结果等等。

使用道具 举报

回复
论坛徽章:
2
2011新春纪念徽章
日期:2011-01-04 10:38:212011新春纪念徽章
日期:2011-02-18 11:43:33
85#
发表于 2011-4-12 22:40 | 只看该作者
这个帖子看的我快对SQL失去信心了

我是不是得再学点别的编程语言?

perl,php?帮忙推荐下哦

使用道具 举报

回复
论坛徽章:
58
生肖徽章2007版:马
日期:2009-11-06 23:12:33授权会员
日期:2013-01-10 14:38:592013年新春福章
日期:2013-02-25 14:51:24马自达
日期:2013-08-07 10:54:45红旗
日期:2013-08-09 13:48:48劳斯莱斯
日期:2013-09-12 15:56:37萤石
日期:2013-10-31 08:44:19优秀写手
日期:2013-12-18 09:29:13Jeep
日期:2014-01-14 10:53:432014年新春福章
日期:2014-02-18 16:43:09
86#
发表于 2011-4-12 23:17 | 只看该作者
够折腾的了

使用道具 举报

回复
论坛徽章:
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
87#
发表于 2011-4-12 23:59 | 只看该作者
原帖由 影之哀伤 于 11-4-12 22:40 发表
这个帖子看的我快对SQL失去信心了

我是不是得再学点别的编程语言?

perl,php?帮忙推荐下哦


别,他们玩高精尖的,属于80%的东西解决20%的问题的

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
88#
 楼主| 发表于 2011-4-13 16:48 | 只看该作者
把4,5列剔出重复石头,比82快4倍
SQL> @c:\downloads\testcte2

T.PATH||'*'||T2.PATH
------------------------------------------------------------------------------------------------------------------------------------------------------
,01,09,17,25,33,41,49,57,50,58,59,51,43,35,27,19,11,03,04,12,20,28,36,44,52,60*61,53,45,37,29,21,13,05,06,14,22,30,38,46,54,62,63,55,47,39,31,23,15,07
,08,16,24,32,40,48,56,64,

已用时间:  00: 00: 04.47

  1. wITH d AS (
  2.   SELECT to_char(ROWNUM,'fm09') id
  3.         ,CEIL(ROWNUM/8) r
  4.         ,MOD(ROWNUM-1,8)+1 c
  5.         ,ROWNUM val
  6.     FROM DUAL
  7.    CONNECT BY ROWNUM<=64
  8.   )
  9. ,t(r,c,val,total,path) AS (
  10.   SELECT r,c,val,val,','||CAST(id AS VARCHAR2(1000)) FROM d WHERE r=1 AND c=1
  11.   UNION ALL
  12.   SELECT d.r,d.c,d.val,d.val+t.total,t.path||','||d.id
  13.     FROM t, d
  14.    WHERE INSTR(t.path||',',','||d.id||',')=0
  15.          AND (d.r,d.c) IN ((t.r-1,t.c),(t.r+1,t.c),(t.r,t.c+1),(t.r-1,t.c+1),(t.r+1,t.c+1))
  16.          AND d.val+t.total<:M
  17.          and t.c<4
  18.   )
  19.   ,t4ud (r,c,val,total,path)as (
  20.   select  r,c,val,total,path from
  21.   (select r,c,val,total,path ,row_number()over(partition by r,c,val,total,substr(path,-2) order by length(path))rn from t where t.c=4)where rn=1 union all
  22.   SELECT d.r,d.c,d.val,d.val+t.total total ,t.path||','||d.id path
  23.     FROM t4ud t, d
  24.    WHERE INSTR(t.path||',',','||d.id||',')=0
  25.          AND (d.r,d.c) IN ((t.r-1,t.c),(t.r+1,t.c))
  26.          AND d.val+t.total<:M)
  27.   ,t4udd (r,c,val,total,path)as (
  28.   select  r,c,val,total,path from
  29.   (select r,c,val,total,path ,row_number()over(partition by r,c,val,total,substr(path,-2) order by length(path))rn from t4ud t where t.c=4)where rn=1)
  30. ,t2(r,c,val,total,path) AS (
  31.   SELECT r,c,val,val,CAST(id AS VARCHAR2(1000))||',' FROM d WHERE r=8 AND c=8
  32.   UNION ALL
  33.   SELECT d.r,d.c,d.val,d.val+t.total,d.id||','||t.path
  34.     FROM t2 t, d
  35.    WHERE INSTR(t.path||',',','||d.id||',')=0
  36.          AND (d.r,d.c) IN ((t.r+1,t.c),(t.r-1,t.c),(t.r,t.c-1),(t.r+1,t.c-1),(t.r-1,t.c-1))
  37.          AND d.val+t.total<:M
  38.          and t.c>5
  39.   )
  40.   ,t5ud (r,c,val,total,path)as (
  41.   select  r,c,val,total,path from
  42.   (select r,c,val,total,path ,row_number()over(partition by r,c,val,total,substr(path,1,2) order by length(path))rn from t2 t where t.c=5)where rn=1 union all
  43.   SELECT d.r,d.c,d.val,d.val+t.total total ,d.id||','||t.path path
  44.     FROM t5ud t, d
  45.    WHERE INSTR(t.path||',',','||d.id||',')=0
  46.          AND (d.r,d.c) IN ((t.r-1,t.c),(t.r+1,t.c))
  47.          AND d.val+t.total<:M)
  48.   ,t5udd (r,c,val,total,path)as (
  49.   select  r,c,val,total,path from
  50.   (select r,c,val,total,path ,row_number()over(partition by r,c,val,total,substr(path,1,2) order by length(path))rn from t5ud t where t.c=5)where rn=1)
  51. SELECT /*+ ordered use_hash(t t2)   */t.path||'*'||t2.path FROM t4udd t,t5udd t2
  52. WHERE (t.r=t2.r or t.r=t2.r-1 or  t.r=t2.r+1)AND t.c=4 and t2.c=4+1
  53. AND t.total=:M-t2.total and rownum=1;  
  54.   ;
复制代码

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
89#
 楼主| 发表于 2011-4-14 09:36 | 只看该作者
借鉴rollpig的思想
在t4ud和t5ud 中加入条件d.c=4和d.c=5
速度再提高1倍,不过跟74相比还是慢
SQL> @c:\downloads\testcte2

T.PATH||'*'||T2.PATH
------------------------------------------------------------------------------------------------------------------------------------------------------
,01,09,17,25,33,41,49,57,50,58,59,51,43,35,27,19,11,03,04,12,20,28,36,44,52,60*61,53,45,37,29,21,13,05,06,14,22,30,38,46,54,62,63,55,47,39,31,23,15,07
,08,16,24,32,40,48,56,64,

已用时间:  00: 00: 02.04

SQL> @c:\downloads\rp1

N
-
Y
已用时间:  00: 00: 00.13

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
90#
 楼主| 发表于 2011-4-14 10:11 | 只看该作者
在t t2条件增加d.c>=t.c 和d.c<=t.c
SQL> @c:\downloads\testcte2

T.PATH||'*'||T2.PATH
------------------------------------------------------------------------------------------------------------------------------------------------------
,01,09,17,25,33,41,49,57,50,58,59,51,43,35,27,19,11,03,04,12,20,28,36,44,52,60*61,53,45,37,29,21,13,05,06,14,22,30,38,46,54,62,63,55,47,39,31,23,15,07
,08,16,24,32,40,48,56,64,

已用时间:  00: 00: 01.97

使用道具 举报

回复

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

本版积分规则 发表回复

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