楼主: 〇〇

[精华] Puzzleup 2010 比赛快开始了,大家用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
21#
 楼主| 发表于 2010-8-6 05:31 | 只看该作者
需要证明比较大的数都能表示成多个平方和...

使用道具 举报

回复
论坛徽章:
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
22#
发表于 2010-8-6 09:40 | 只看该作者
原帖由 〇〇 于 10-8-6 05:31 发表
需要证明比较大的数都能表示成多个平方和...


对,但这个很难证明

使用道具 举报

回复
论坛徽章:
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
23#
 楼主| 发表于 2010-8-6 09:49 | 只看该作者
with t as (select level*leve l from dual connect by level<=100)
,t1 as (select level l from dual connect by level<=1E4)
...

使用道具 举报

回复
论坛徽章:
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
24#
发表于 2010-8-6 10:56 | 只看该作者
〇〇做啦?你要做了我就不做了

使用道具 举报

回复
论坛徽章:
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
25#
 楼主| 发表于 2010-8-6 11:19 | 只看该作者

回复 #24 lastwinner 的帖子

我不做了,中午还要去还款...

使用道具 举报

回复
论坛徽章:
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
26#
发表于 2010-8-6 13:19 | 只看该作者
原帖由 lastwinner 于 10-8-6 00:50 发表


同怀疑,但我现在找不到证明方法
明天写个sql,用排列组合求和,然后找缺失的数……

遵循该思路,但是,采用distinct level的方法,数据量太大太恐怖了 (参阅 http://www.itpub.net/viewthread. ... p%3Bfilter%3Ddigest

所以我采用一种变通的方法来尝试此问题
具体思路会在下面的程序中指明

先看表结构:
  1. CREATE TABLE SQUARENUM
  2. (
  3.   N   NUMBER,
  4.   SN  NUMBER
  5. )
  6. LOGGING
  7. NOCOMPRESS
  8. NOCACHE
  9. NOPARALLEL
  10. MONITORING;

  11. COMMENT ON TABLE SQUARENUM IS '平方数基表';


  12. CREATE UNIQUE INDEX SQUARENUM_PK ON SQUARENUM
  13. (N)
  14. LOGGING
  15. NOPARALLEL;


  16. ALTER TABLE SQUARENUM ADD (
  17.   CONSTRAINT SQUARENUM_PK
  18.   PRIMARY KEY
  19.   (N)
  20.   USING INDEX SQUARENUM_PK);


  21. CREATE TABLE SUMSQUARE
  22. (
  23.   S  NUMBER,
  24.   CONSTRAINT SUMSQUARE_PK
  25.   PRIMARY KEY
  26.   (S)
  27.   USING INDEX SUMSQUARE_PK
  28. )
  29. ORGANIZATION INDEX
  30. LOGGING
  31. NOPARALLEL
  32. MONITORING;

  33. COMMENT ON TABLE SUMSQUARE IS '可拆分为不相同的平方数的和的数';


  34. CREATE TABLE SUMSQUARE_P
  35. (
  36.   CURRSN  NUMBER
  37. )
  38. LOGGING
  39. NOCOMPRESS
  40. NOCACHE
  41. NOPARALLEL
  42. MONITORING;

  43. COMMENT ON TABLE SUMSQUARE_P IS '指明当前操作处理到哪个数字了';
复制代码


再看数据初始化脚本:

  1. insert into SUMSQUARE  --将向表中插入前15个平方数任意组合后得到的和,去重后将不同和值以及0插入到表中
  2. -- 0本质上不算符合条件的数,加入0只是为了便于后面存储过程的操作
  3. select 0 from dual
  4. union
  5. select distinct dbms_aw.eval_number(xmlpath) from (
  6. select sn, 0||sys_connect_by_path(sn, '+') xmlpath from
  7.     (select * from squarenum where n<=15)
  8.      connect by n<prior n
  9.      )
  10.      order by 1 asc;

  11. Insert into SUMSQUARE_P   (CURRSN) Values   (0);
  12. COMMIT;
复制代码

dbms_aw.eval_number  参阅  http://www.itpub.net/thread-1266657-1-1.html


以及存储过程(这是核心)

  1. create or replace procedure insertss(st in number, en in number) as
  2. v_n number:=-1;
  3. begin
  4.     select currsn into v_n from sumsquare_p;
  5.     v_n :=greatest(st, v_n);
  6.     for v_n in st .. en loop
  7.         insert into SUMSQUARE
  8.         with tt as (select sn from SQUARENUM where n=v_n)
  9.         select distinct (num.sn+total.s) from  tt num, SUMSQUARE total
  10.         minus
  11.         select s from SUMSQUARE where s>= (select sn from tt);
  12.         UPDATE SCOTT.SUMSQUARE_P SET    CURRSN = v_n;
  13.     end loop;
  14. end;
  15. /
复制代码

该存储过程是将当前已有可拆分为不同平方数和的数与更大的一个平方数相加,然后从和中去除在sumsquare中已经存在的值
st和en分别表示开始和结束的平方数的平方根




在初始化完成后,sumsquare表中的数据指标情况如下:
sql> select max(s) maxs, count(*) cnt, max(s)-count(*) gap from sumsquare;

      MAXS        CNT        GAP
---------- ---------- ----------
      1240       1179         61

[ 本帖最后由 lastwinner 于 2010-8-6 13:22 编辑 ]

使用道具 举报

回复
论坛徽章:
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
27#
发表于 2010-8-6 13:28 | 只看该作者
具体操作一下:

sql> exec insertss(16,50);

PL/SQL 过程已成功完成。

已用时间:  00: 00: 01.12
sql> select max(s) maxs, count(*) cnt, max(s)-count(*) gap from su
msquare;

      MAXS        CNT        GAP
---------- ---------- ----------
     42925      42864         61

sql> exec insertss(51,100);

PL/SQL 过程已成功完成。

已用时间:  00: 00: 14.82
sql> select max(s) maxs, count(*) cnt, max(s)-count(*) gap from su
msquare;

      MAXS        CNT        GAP
---------- ---------- ----------
    338350     338289         61

已用时间:  00: 00: 00.03




gap值始终是61,这意味着在初始化数据完成后,至少从1240开始,以后的每个数都能表示为m个不同平方数的和

使用道具 举报

回复
论坛徽章:
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
28#
 楼主| 发表于 2010-8-6 13:30 | 只看该作者
http://baike.baidu.com/view/942218.htm
四平方和定理说明所有正整数均可表示为最多四个平方数的和。但不是"不同"的平方数的和

使用道具 举报

回复
论坛徽章:
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
29#
发表于 2010-8-6 13:44 | 只看该作者
ok,现在开始找缺失的数,最大的那个,可能就是题目要求的那个数
找缺失数的方法详见 http://www.itpub.net/thread-719692-1-1.html

with tt as (SELECT lags s, e
            FROM (SELECT  s,  s-1 e,
                           lag(s,1) OVER(ORDER BY s)+1 lags
                     FROM sumsquare
                 )
            WHERE e-lags>=0
)
SELECT a.s+b.dis-1 h
FROM tt a,
     (SELECT rownum dis FROM
        (SELECT max(e-s+1) gap FROM tt)
     CONNECT BY rownum<=gap) b
WHERE a.s+b.dis-1<=a.e
ORDER BY 1;


当前已经进行到100的平方了,得到结果如下
sql>/

         H
----------
         2
         3
         6
         7
         8
        11
        12
        15
        18
        19
        22
        23
        24
        27
        28
        31
        32
        33
        43
        44
        47
        48
        60
        67
        72
        76
        92
        96
       108
       112
       128
    338222
    338238
    338242
    338254
    338258
    338274
    338278
    338283
    338290
    338302
    338303
    338306
    338307
    338317
    338318
    338319
    338322
    338323
    338326
    338327
    338328
    338331
    338332
    338335
    338338
    338339
    338342
    338343
    338344
    338347
    338348

已选择62行。







后面一串6位数貌似不是答案,倒是128很像


再继续处理一些数:
sql>exec insertss(101,110);

PL/SQL 过程已成功完成。

已用时间:  00: 00: 07.26
sql>select max(s) maxs, count(*) cnt, max(s)-count(*) gap from sumsquare;

      MAXS        CNT        GAP
---------- ---------- ----------
    449735     449674         61

已用时间:  00: 00: 00.09

找缺失的:
         H
----------
         2
         3
         6
         7
         8
        11
        12
        15
        18
        19
        22
        23
        24
        27
        28
        31
        32
        33
        43
        44
        47
        48
        60
        67
        72
        76
        92
        96
       108
       112
       128
    449607
    449623
    449627
    449639
    449643
    449659
    449663
    449668
    449675
    449687
    449688
    449691
    449692
    449702
    449703
    449704
    449707
    449708
    449711
    449712
    449713
    449716
    449717
    449720
    449723
    449724
    449727
    449728
    449729
    449732
    449733

已选择62行。




再多的试验我不想做了,该题的答案应该是128,现在就是要证明为毛就是128……

使用道具 举报

回复
论坛徽章:
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
30#
发表于 2010-8-6 13:44 | 只看该作者
原帖由 〇〇 于 10-8-6 13:30 发表
http://baike.baidu.com/view/942218.htm
四平方和定理说明所有正整数均可表示为最多四个平方数的和。但不是"不同"的平方数的和


这个我看了,没毛用

使用道具 举报

回复

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

本版积分规则 发表回复

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