楼主: 〇〇

[精华] Puzzleup 2010 比赛快开始了,大家用SQL解答啊

[复制链接]
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
141#
发表于 2010-9-15 23:32 | 只看该作者
第10题:四位编码

利用26个英文字母组成四位编码,在这些编码构成的集合中,一个编码和另一编码不能够存在这样的关系:第一个编码任意取出2,3,4位连续的字串变为反序,构成第二个编码。
例如,假设集合中包含编码ABCC, 则该集合中不能包含下列编码:

BACC  -- 1,2位反序
ACBC  -- 2,3位反序
CBAC  -- 1,2,3位反序
ACCB  -- 2,3,4位反序
CCBA  -- 1,2,3,4位反序

这样的集合,最多可以包含几个编码?

VAR NUM NUMBER;
EXEC :NUM :=2;

WITH c AS (  ---- 求出所有NUM个不同字符构成的四位编码
     SELECT n,POWER(2,ROWNUM) id --- 每个编码占二进制的1位构成ID
       FROM (SELECT REPLACE(SYS_CONNECT_BY_PATH(n,','),',') n
               FROM (SELECT ROWNUM n FROM DUAL CONNECT BY ROWNUM<=:NUM)
              WHERE LEVEL=4
              CONNECT BY LEVEL<=4
             )
     WHERE TRANSLATE(SUBSTR('1234',1,:NUM),'$'||n,'$') IS NULL  ----- 四位编码中有NUM个不同字符
    )
,s AS ( ----求出所有发生冲突的编码
SELECT t1.id,SUM(t2.id) rev_bits  ---- 这些都是不能出现的id, 每个占一位,按照二进制的位求和就得到所有发生冲突的id的一个总集合
  FROM c t1,c t2
WHERE t2.n IN (t1.n
                --- 两位反序
               ,SUBSTR(t1.n,2,1)||SUBSTR(t1.n,1,1)||SUBSTR(t1.n,3,2)     -- 2134
               ,SUBSTR(t1.n,1,1)||SUBSTR(t1.n,3,1)||SUBSTR(t1.n,2,1)||SUBSTR(t1.n,4,1)     -- 1324
               ,SUBSTR(t1.n,1,2)||SUBSTR(t1.n,4,1)||SUBSTR(t1.n,3,1)     -- 1243
                --- 三位反序
               ,SUBSTR(t1.n,3,1)||SUBSTR(t1.n,2,1)||SUBSTR(t1.n,1,1)||SUBSTR(t1.n,4,1)     -- 3214
               ,SUBSTR(t1.n,1,1)||SUBSTR(t1.n,4,1)||SUBSTR(t1.n,3,1)||SUBSTR(t1.n,2,1)     -- 1432
                --- 四位反序
               ,SUBSTR(t1.n,4,1)||SUBSTR(t1.n,3,1)||SUBSTR(t1.n,2,1)||SUBSTR(t1.n,1,1)     -- 4321
               )
GROUP BY t1.id
)
,t(id,cnt,bits) AS ( ---- 递归求出所有不冲突的编码的集合
   SELECT id,1,id FROM s
   UNION ALL
   SELECT s.id,t.cnt+1,t.bits+s.id
     FROM t,s
    WHERE t.id<s.id AND BITAND(t.bits,s.rev_bits)=0  ---- 和所有ID都没有冲突
)
SELECT MAX(cnt) FROM t   ---- 该集合最大可能为多少个元素
;

  MAX(CNT)
----------
         4


jsu@JSU> EXEC :NUM :=3;

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.00
jsu@JSU> /

  MAX(CNT)
----------
        15

Elapsed: 00:00:20.20

jsu@JSU> EXEC :NUM :=4;

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.00
jsu@JSU> /

  MAX(CNT)
----------
         8

Elapsed: 00:00:00.11


1*26 + 4*C(2,26) + 15*C(3,26) + 8*C(4,26) = 159926

使用道具 举报

回复
论坛徽章:
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
142#
 楼主| 发表于 2010-9-15 23:52 | 只看该作者
写得比我看得还快...

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
143#
发表于 2010-9-15 23:54 | 只看该作者
太高深了,看的脑子晕晕的

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
144#
发表于 2010-9-16 00:27 | 只看该作者
写得匆忙也不知道有没有错。

下面是求出2,3,4个字母的最大集合的一个样本:

AABA,AABB,BABA,BBAB

AACB,ABAC,ABCC,ACBA,ACBB,BACA,BACB,BBAC,BCAC,BCBA,CABC,CBAA,CBAB,CBCA,CCAB

ABDC,ADCB,BCAD,BDCA,CABD,CBDA,DABC,DCAB

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
145#
发表于 2010-9-16 05:53 | 只看该作者
合成一个SQL: (最后的求和没有做)
WITH c AS (  ---- 求出所有NUM个不同字符构成的四位编码
   SELECT num,n,POWER(2,ROW_NUMBER() OVER(PARTITION BY num ORDER BY n)) id
     FROM (SELECT 4-NVL(LENGTH(TRANSLATE('ABCD','$'||n,'$')),0) num,n
             FROM (SELECT REPLACE(SYS_CONNECT_BY_PATH(n,','),',') n
                     FROM (SELECT CHR(64+ROWNUM) n FROM DUAL CONNECT BY ROWNUM<=4)
                    WHERE LEVEL=4
                    CONNECT BY LEVEL<=4
                   )
           )
     WHERE TRANSLATE(n,'$'||SUBSTR('ABCD',1,num),'$') IS NULL
    )
,s AS ( ----求出所有发生冲突的编码
SELECT t1.num,t1.id,t1.n,SUM(t2.id) rev_bits  ---- 这些都是不能出现的id, 每个占一位,按照二进制的位求和就得到所有发生冲突的id的一个总集合
  FROM c t1,c t2
WHERE t1.num=t2.num AND
       t2.n IN (t1.n
                --- 两位反序
               ,SUBSTR(t1.n,2,1)||SUBSTR(t1.n,1,1)||SUBSTR(t1.n,3,2)     -- 2134
               ,SUBSTR(t1.n,1,1)||SUBSTR(t1.n,3,1)||SUBSTR(t1.n,2,1)||SUBSTR(t1.n,4,1)     -- 1324
               ,SUBSTR(t1.n,1,2)||SUBSTR(t1.n,4,1)||SUBSTR(t1.n,3,1)     -- 1243
                --- 三位反序
               ,SUBSTR(t1.n,3,1)||SUBSTR(t1.n,2,1)||SUBSTR(t1.n,1,1)||SUBSTR(t1.n,4,1)     -- 3214
               ,SUBSTR(t1.n,1,1)||SUBSTR(t1.n,4,1)||SUBSTR(t1.n,3,1)||SUBSTR(t1.n,2,1)     -- 1432
                --- 四位反序
               ,SUBSTR(t1.n,4,1)||SUBSTR(t1.n,3,1)||SUBSTR(t1.n,2,1)||SUBSTR(t1.n,1,1)     -- 4321
               )
GROUP BY t1.num,t1.id,t1.n
)
,t(num,id,cnt,bits,path) AS ( ---- 递归求出所有不冲突的编码的集合
   SELECT num,id,1,id,n FROM s
   UNION ALL
   SELECT t.num,s.id,t.cnt+1,t.bits+s.id,t.path||','||s.n
     FROM t,s
    WHERE t.num=s.num AND t.id<s.id AND BITAND(t.bits,s.rev_bits)=0  ---- 和所有ID都没有冲突
)
SELECT cnt,path FROM (SELECT t.*,ROW_NUMBER() OVER(PARTITION BY num ORDER BY cnt DESC) rn FROM t)
WHERE rn=1
;


       CNT    PATH
----------  -----------------------------------------------------------------------------------
         1    AAAA
         4    ABBA,ABBB,BAAA,BAAB
        15    AACB,ABAC,ABCB,ABCC,ACBA,BABC,BACA,BBCA,BCAB,BCAC,CABB,CABC,CBAA,CBCA,CCAB
         8    ACBD,ADCB,BADC,BDCA,CADB,CBAD,DBAC,DCBA


Elapsed: 00:00:24.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
146#
发表于 2010-9-16 10:58 | 只看该作者
我考虑到一种情况,不知对否
假设有一编码c0,按规则翻转后得到集合gc0,gc0中包含c1,c2和其他一些翻转结果,c1不能按规则翻转得到c2
c1和c2分别按规则翻转后得到集合gc1和gc2,gc1和gc2中肯定都包含c0,并且还会包含一些相同的编码,当然剩下的就是不同的编码了

比如c0=ABCC
c1=BACC  -- 1,2位反序
c2=CCBA  -- 1,2,3,4位反序


这时候保留c0,就不如保留c1、c2

——————————————————————————————————————

当然,以上是就个体而言,如果从整体来看,可能选谁都能得到最大的编码数

使用道具 举报

回复
论坛徽章:
0
147#
发表于 2010-9-16 13:53 | 只看该作者

回复 #145 newkid 的帖子

4个字母序列,非为4类:
有2个字母重复,有3个字母重复,4个字母一样,4个字母都不同。

只研究这四类(然后再乘组合数就OK):
AABC
AAAB
AAAA
ABCD

我看到你不是这样分类的,这样分类人肉即可,只是ABCD四个字母都不同的时候,人肉会费力,需要程序,你算出了8.

使用道具 举报

回复
论坛徽章:
0
148#
发表于 2010-9-16 14:05 | 只看该作者
我和你的分类方法不一样,如147楼。算出的值是159276

使用道具 举报

回复
论坛徽章:
0
149#
发表于 2010-9-16 14:08 | 只看该作者
有两个字母重复的,我是用AABC,楼算AABB,这样人肉后也是159926

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
150#
发表于 2010-9-16 22:26 | 只看该作者
原帖由 haiersknl 于 2010-9-16 14:05 发表
我和你的分类方法不一样,如147楼。算出的值是159276

我的分类方法和你147楼完全等价啊?你到达认为哪个结果是对的?159276是怎么算出来的?

使用道具 举报

回复

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

本版积分规则 发表回复

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