楼主: 〇〇

[SQL] puzzleup 2016

[复制链接]
论坛徽章:
94
生肖徽章2007版:牛
日期:2012-08-02 22:43:00紫蛋头
日期:2012-12-08 09:43:38鲜花蛋
日期:2012-11-17 12:02:07鲜花蛋
日期:2013-02-05 21:53:34复活蛋
日期:2012-11-17 12:02:07SQL极客
日期:2013-12-09 14:13:35SQL数据库编程大师
日期:2013-12-06 13:59:43SQL大赛参与纪念
日期:2013-12-06 14:10:50ITPUB季度 技术新星
日期:2012-11-27 10:16:10最佳人气徽章
日期:2013-03-19 17:24:25
111#
发表于 2016-9-1 10:47 | 只看该作者
这题应该用一个connect by就能写出来了,算法就是我们手工找的过程,但是我手头没有oracle环境...

使用道具 举报

回复
论坛徽章:
8
玉兔
日期:2015-11-16 10:18:00铁扇公主
日期:2015-10-27 21:47:42九尾狐狸
日期:2015-12-11 22:31:15
112#
发表于 2016-9-1 13:53 | 只看该作者
分支定界怎么样?
In[1]:= f[k_]:=Floor[(Sqrt[4*(4k-6)+1]-1)/2];
Table[{k,f[k],(k+k-f[k]+1)*f[k]/2},{k,2,99}]

Out[2]= {{2,1,2},{3,2,5},{4,2,7},{5,3,12},{6,3,15},{7,4,22},{8,4,26},{9,5,35},{10,5,40},{11,5,45},{12,6,57},{13,6,63},{14,6,69},{15,6,75},{16,7,91},{17,7,98},{18,7,105},{19,7,112},{20,8,132},{21,8,140},{22,8,148},{23,8,156},{24,9,180},{25,9,189},{26,9,198},{27,9,207},{28,9,216},{29,10,245},{30,10,255},{31,10,265},{32,10,275},{33,10,285},{34,10,295},{35,11,330},{36,11,341},{37,11,352},{38,11,363},{39,11,374},{40,11,385},{41,12,426},{42,12,438},{43,12,450},{44,12,462},{45,12,474},{46,12,486},{47,13,533},{48,13,546},{49,13,559},{50,13,572},{51,13,585},{52,13,598},{53,13,611},{54,14,665},{55,14,679},{56,14,693},{57,14,707},{58,14,721},{59,14,735},{60,14,749},{61,14,763},{62,15,825},{63,15,840},{64,15,855},{65,15,870},{66,15,885},{67,15,900},{68,15,915},{69,15,930},{70,16,1000},{71,16,1016},{72,16,1032},{73,16,1048},{74,16,1064},{75,16,1080},{76,16,1096},{77,16,1112},{78,17,1190},{79,17,1207},{80,17,1224},{81,17,1241},{82,17,1258},{83,17,1275},{84,17,1292},{85,17,1309},{86,17,1326},{87,18,1413},{88,18,1431},{89,18,1449},{90,18,1467},{91,18,1485},{92,18,1503},{93,18,1521},{94,18,1539},{95,18,1557},{96,18,1575},{97,19,1672},{98,19,1691},{99,19,1710}}

应当可以去掉很大部分的工作,比方50的时候 {50,13,572} ,剩余的价值不可能超过 572

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
113#
发表于 2016-9-1 16:11 | 只看该作者
本帖最后由 solomon_007 于 2016-9-1 16:12 编辑

SQL> with t as (select level n from dual connect by level <100),
  2       s(lvl,n,sumn) as (select 1 lvl,
  3                                cast(n as varchar2(4000)),
  4                                n
  5                           from t
  6                          where n =(select max(n) from t)
  7                         union all
  8                         select s.lvl + 1,
  9                                s.n||','||t.n,
10                                s.sumn + t.n
11                           from s,t
12                          where s.lvl < 20
13                            and t.n = (select max(n)
14                                         from t
15                                        where t.n not in (select column_value  from table(pkg_split.str_split(s.n)))
16                                          and ((s.lvl + 1)*s.lvl/2) = (select count(distinct x.a+y.b)
17                                                                        from (select column_value a from table(pkg_split.str_split(s.n||','||t.n))) x,
18                                                                             (select column_value b from table(pkg_split.str_split(s.n||','||t.n))) y
19                                                                       where x.a < y.b
20                                                                        )
21                                        )
22                          )
23   select * from s
24  /
       LVL N                                                                                      SUMN
---------- -------------------------------------------------------------------------------- ----------
         1 99                                                                                       99
         2 99,98                                                                                   197
         3 99,98,97                                                                                294
         4 99,98,97,95                                                                             389
         5 99,98,97,95,92                                                                          481
         6 99,98,97,95,92,87                                                                       568
         7 99,98,97,95,92,87,79                                                                    647
         8 99,98,97,95,92,87,79,70                                                                 717
         9 99,98,97,95,92,87,79,70,61                                                              778
        10 99,98,97,95,92,87,79,70,61,47                                                           825
        11 99,98,97,95,92,87,79,70,61,47,26                                                        851
        12 99,98,97,95,92,87,79,70,61,47,26,5                                                      856
12 rows selected

使用道具 举报

回复
论坛徽章:
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
114#
 楼主| 发表于 2016-9-1 16:13 | 只看该作者
solomon_007 发表于 2016-9-1 16:11
SQL> with t as (select level n from dual connect by level

为什么每步选出的一定留下?

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
115#
发表于 2016-9-1 16:15 | 只看该作者
两个数的和 3,4,5。。。197,不同的值只有 195,任意两个的和不同,所以 n 取值满足: n*(n-1)/2 < 195 ,所以 n<=20

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
116#
发表于 2016-9-1 16:16 | 只看该作者
一个SQL 不好搞,这里 PKG_SPLIT:

create or replace package pkg_split is

  type t_tab is table of varchar2(32767);

  function str_split (p_str in varchar2, p_del in varchar2 default ',')
  return t_tab pipelined;

end;
/

create or replace package body pkg_split is

  function str_split (p_str in varchar2, p_del in varchar2 default ',')
  return t_tab pipelined
  is
  begin
    for rec in (select regexp_substr(p_str,'[^'||p_del||']+', 1, level) str
                  from dual
                connect by level <= (regexp_count(p_str,p_del) + 1) ) loop

        pipe row(rec.str);
    end loop;

    return;
  end;

end;
/

就是常用的分割字符串的函数

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
117#
发表于 2016-9-1 16:18 | 只看该作者
〇〇 发表于 2016-9-1 16:13
为什么每步选出的一定留下?

把这个串留着好计算两两的和不同啊

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
118#
发表于 2016-9-1 16:37 | 只看该作者
〇〇 发表于 2016-9-1 16:13
为什么每步选出的一定留下?

我这才明白你的意思, 确实,这是象NEWKID那样的尝试猜测。。。

完全有可能存在另一个集合,总个数比12大,又<=20,而两两相加和不等,总和比这个大。。。

使用道具 举报

回复
论坛徽章:
8
玉兔
日期:2015-11-16 10:18:00铁扇公主
日期:2015-10-27 21:47:42九尾狐狸
日期:2015-12-11 22:31:15
119#
发表于 2016-9-1 18:05 | 只看该作者
好吧,我觉得我们的直觉是正确的,贪婪就是最优解
http://oeis.org/A011185

使用道具 举报

回复
论坛徽章:
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
120#
 楼主| 发表于 2016-9-1 18:13 | 只看该作者
lugionline 发表于 2016-9-1 18:05
好吧,我觉得我们的直觉是正确的,贪婪就是最优解
http://oeis.org/A011185

如果把100改为1000呢,改为10呢

使用道具 举报

回复

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

本版积分规则 发表回复

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