楼主: 〇〇

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

[复制链接]
论坛徽章:
2
2011新春纪念徽章
日期:2011-01-04 10:38:212011新春纪念徽章
日期:2011-02-18 11:43:33
11#
发表于 2011-4-9 00:53 | 只看该作者
找PATH的 可否提前计算好。。。

等表和其他参数固定后再运行,来提高效率呢???
把大师那个result当已知条件

使用道具 举报

回复
论坛徽章:
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
12#
发表于 2011-4-9 01:38 | 只看该作者
PATH太多了,事先算好更不合算。

这个数据是从小到大,如果反过来从终点出发只要1秒多就能找到第一个答案:

WITH d AS (
  SELECT ROWNUM id
        ,CEIL(ROWNUM/8) r
        ,MOD(ROWNUM-1,8)+1 c
        ,ROWNUM val
    FROM DUAL
   CONNECT BY ROWNUM<=64
  )
,t(r,c,val,total,path) AS (
  SELECT r,c,val,val,','||CAST(id AS VARCHAR2(1000)) FROM d WHERE r=8 AND c=8
  UNION ALL
  SELECT d.r,d.c,d.val,d.val+t.total,t.path||','||d.id
    FROM t,d
   WHERE INSTR(t.path||',',','||d.id||',')=0
         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))
         AND d.val+t.total<=:M
         AND (t.r<>1 OR t.c<>1)
  )
SELECT path FROM t WHERE r=1 AND c=1 AND total=:M AND ROWNUM=1;

PATH
---------------------------------
,64,55,62,53,45,37,28,19,10,1

大数相加很快溢出所以能及早中止遍历。

使用道具 举报

回复
论坛徽章:
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
13#
 楼主| 发表于 2011-4-9 08:04 | 只看该作者
我这里第一个数据测的时间和newkid很接近
但题意没有说各个grid的stone有序,因此倒排不能作为优化办法

使用道具 举报

回复
论坛徽章:
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
14#
 楼主| 发表于 2011-4-9 08:09 | 只看该作者
第2个数据,已经运行了5分钟,临时表空间已经自动扩充到2G,还在增长。原题32M内存怎么够?

使用道具 举报

回复
论坛徽章:
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
15#
 楼主| 发表于 2011-4-9 08:20 | 只看该作者
google查到的思路
ID 2634
PROG Collecting Stones
CPLX C
CLS 搜索/暴力
DTL 这道题我是用二分法,先搜前四列,做成有序表。然后在搜完后四列后,二分查找前面的部分就可以了。

使用道具 举报

回复
论坛徽章:
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
16#
 楼主| 发表于 2011-4-9 17:00 | 只看该作者
WITH d AS (
  SELECT ROWNUM id
        ,CEIL(ROWNUM/8) r
        ,MOD(ROWNUM-1,8)+1 c
        ,ROWNUM val
    FROM DUAL
   CONNECT BY ROWNUM<=64
  )
,dl as (select * from d where c<=:n)  
,dr as (select * from d where c>:n)  
,t(r,c,val,total,path) AS (
  SELECT r,c,val,val,','||CAST(id AS VARCHAR2(1000)) FROM d WHERE r=1 AND c=1
  UNION ALL
  SELECT d.r,d.c,d.val,d.val+t.total,t.path||','||d.id
    FROM t,dL d
   WHERE INSTR(t.path||',',','||d.id||',')=0
         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))
         AND d.val+t.total<=:M
         AND (t.r<>8 OR t.c<>:n)
  )
SELECT path FROM t WHERE r=8 AND c=:n AND total=:M and rownum=1;



SQL> exec :m:=394

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.01
SQL> @c:\downloads\2634

PATH
--------------------------------
,1,9,17,25,33,42,43,51,52,60,61

已用时间:  00: 00: 04.08
SQL> exec :n:=4

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.01
SQL> @c:\downloads\2634

PATH
--------------------------------
,1,9,17,25,33,41,49,50,58,51,60

已用时间:  00: 00: 00.98
SQL> exec :n:=6

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.00
SQL> @c:\downloads\2634

PATH
--------------------------------
,1,9,17,25,33,41,42,51,52,61,62

已用时间:  00: 00: 10.96
SQL> exec :n:=7

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.01
SQL> @c:\downloads\2634

PATH
--------------------------------
,1,9,17,25,26,35,43,52,61,62,63

已用时间:  00: 00: 20.62
SQL> exec :n:=8

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.00
SQL> @c:\downloads\2634

PATH
--------------------------------
,1,9,17,18,27,36,44,53,62,63,64

已用时间:  00: 00: 28.04
SQL>

使用道具 举报

回复
论坛徽章:
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
17#
 楼主| 发表于 2011-4-9 17:05 | 只看该作者
把grid看作城市,stone看作里程,这道题就和第3题很像,不过变成给了固定的车费,怎么从起点到终点刚好花完

使用道具 举报

回复
论坛徽章:
2
2011新春纪念徽章
日期:2011-01-04 10:38:212011新春纪念徽章
日期:2011-02-18 11:43:33
18#
发表于 2011-4-10 15:40 | 只看该作者
问题改成 64个数里凑出来合出指定的值的话,问题是变难还是变简单了?

使用道具 举报

回复
论坛徽章:
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
19#
 楼主| 发表于 2011-4-10 18:14 | 只看该作者

回复 #18 影之哀伤 的帖子

如果没有限制,候选集会更大..

使用道具 举报

回复
论坛徽章:
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
20#
 楼主| 发表于 2011-4-10 22:02 | 只看该作者
SQL> exec :m:=900

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.01
SQL> @c:\downloads\26345

T.PATH||'*'||T2.PATH
--------------------------------------------------------------------------------------------
,01,02,03,04*13,21,29,37,30,38,46,54,62,63,55,47,39,31,23,15,07,16,24,32,40,48,56,64,

已用时间:  00: 00: 10.71
SQL> exec :m:=980

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.01
SQL> /

T.PATH||'*'||T2.PATH
--------------------------------------------------------------------------------------------
,01,10,19,20*21,29,37,45,53,61,62,54,63,55,47,39,31,23,15,07,08,16,24,32,40,48,56,64,

已用时间:  00: 02: 12.06

使用道具 举报

回复

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

本版积分规则 发表回复

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