楼主: newkid

PUZZLEUP 2014

[复制链接]
论坛徽章:
95
生肖徽章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
221#
发表于 2014-9-23 16:10 | 只看该作者
〇〇 发表于 2014-9-23 16:04
用pl/sql应该更快吧

这个似乎未必
看执行计划,也确实在r2.trail=r3.lead上使用了hash join再filter r2.len+r3.len>r2.trail,
如果plsql的话,似乎只能写出nest loop的版本,5w*5w,会慢吧。

使用道具 举报

回复
论坛徽章:
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
222#
发表于 2014-9-23 16:14 | 只看该作者
where   r2.trail=r3.lead
33  and     r2.len+r3.len>r2.trail;

没看懂

使用道具 举报

回复
论坛徽章:
95
生肖徽章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
223#
发表于 2014-9-23 16:21 | 只看该作者
〇〇 发表于 2014-9-23 16:14
where   r2.trail=r3.lead
33  and     r2.len+r3.len>r2.trail;

你会懂的

使用道具 举报

回复
论坛徽章:
0
224#
发表于 2014-9-23 18:00 | 只看该作者
没看懂

使用道具 举报

回复
论坛徽章:
8
玉兔
日期:2015-11-16 10:18:00铁扇公主
日期:2015-10-27 21:47:42九尾狐狸
日期:2015-12-11 22:31:15
225#
发表于 2014-9-23 19:09 | 只看该作者
本帖最后由 lugionline 于 2014-9-23 19:16 编辑
newkid 发表于 2014-9-20 02:42
有没有聪明的人肉办法算出来?

人肉有点困难,公式是在太复杂了,不是我等凡人能搞定的,但是程序算一下应当不困难吧,秒过
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define N 10
  4. long long C[N+1][10];

  5. void main()
  6. {
  7.         long long sum = 0;
  8.         int i, j, d, k;
  9.        
  10.         for(i = 1; i <= N; i++)
  11.         {
  12.                 for(d = 0; d < i; d++) // d 位数, 拼上 (i - d) 个 k
  13.                 {
  14.                         for(j = 1; j < 10; j++)
  15.                         {
  16.                                 // d 位数 以数字 j 结尾
  17.                                 for(k = 1; k < 10; k++) // 拼上 (i - d) 个 k
  18.                                 {
  19.                                         if(i - d > k) continue;
  20.                                         if(k == j) continue;
  21.                                         C[i][k] += C[d][j];
  22.                                 }
  23.                         }
  24.                 }
  25.                 for(d = i; d < 10; d++) // 拼上 i 个 d
  26.                 {
  27.                         C[i][d] += 1;
  28.                 }
  29.         }
  30.        
  31.         for(d = 0; d < 10; d++)
  32.         {
  33.                 sum += C[N][d];
  34.         }
  35.        
  36.         printf("%I64d\r\n", sum);
  37. }
复制代码

使用道具 举报

回复
论坛徽章:
737
季节之章:春
日期:2015-07-31 17:16:29ITPUB季度 技术新星
日期:2014-07-17 14:37:00季节之章:秋
日期:2015-07-31 17:16:14季节之章:夏
日期:2015-07-31 17:16:29股神
日期:2014-10-15 09:23:31衰神
日期:2014-10-20 22:47:12季节之章:冬
日期:2015-07-31 17:16:14红钻
日期:2014-12-16 17:51:41洛杉矶湖人
日期:2016-09-23 08:18:15布鲁克林篮网
日期:2016-09-23 08:17:18
226#
发表于 2014-9-23 21:18 来自手机 | 只看该作者
lugionline 发表于 2014-9-23 19:09
人肉有点困难,公式是在太复杂了,不是我等凡人能搞定的,但是程序算一下应当不困难吧,秒过

c 语言写的啊,三层循环,秒过?

使用道具 举报

回复
论坛徽章:
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
227#
发表于 2014-9-23 21:42 | 只看该作者
本帖最后由 〇〇 于 2014-9-23 21:43 编辑
oracle_cj 发表于 2014-9-23 21:18
c 语言写的啊,三层循环,秒过?


根本不是秒过,而是毫秒过

[oracle@redflag11012501 ~]$ vi mg.c

#include <stdio.h>
#include <stdlib.h>

#define N 10
long C[N+1][10];

void main()
{
        long sum = 0;
        int i, j, d, k;

        for(i = 1; i <= N; i++)
        {
                for(d = 0; d < i; d++) // d 位数, 拼上 (i - d) 个 k
                {
                        for(j = 1; j < 10; j++)
                        {
                                // d 位数 以数字 j 结尾
                                for(k = 1; k < 10; k++) // 拼上 (i - d) 个 k
                                {
                                        if(i - d > k) continue;
                                        if(k == j) continue;
                                        C[ i][k] += C[d][j];
                                }
                        }
                }
                for(d = i; d < 10; d++) // 拼上 i 个 d
                {
                        C[ i][d] += 1;
                }
        }

        for(d = 0; d < 10; d++)
        {
                sum += C[N][d];
        }

        printf("%ld\r\n", sum);
}
~
~
~
~
~
~
~
~
~
"mg.c" [新] 39L, 1047C 已写入                                                                                    
[oracle@redflag11012501 ~]$ gcc -o mg mg.c -O2
mg.c: In function ‘main’:
mg.c:8: 警告:‘main’ 的返回类型不是 ‘int’
[oracle@redflag11012501 ~]$ time ./mg
3110771999

real    0m0.001s
user    0m0.000s
sys     0m0.001s

使用道具 举报

回复
论坛徽章:
737
季节之章:春
日期:2015-07-31 17:16:29ITPUB季度 技术新星
日期:2014-07-17 14:37:00季节之章:秋
日期:2015-07-31 17:16:14季节之章:夏
日期:2015-07-31 17:16:29股神
日期:2014-10-15 09:23:31衰神
日期:2014-10-20 22:47:12季节之章:冬
日期:2015-07-31 17:16:14红钻
日期:2014-12-16 17:51:41洛杉矶湖人
日期:2016-09-23 08:18:15布鲁克林篮网
日期:2016-09-23 08:17:18
228#
发表于 2014-9-23 21:51 | 只看该作者
〇〇 发表于 2014-9-23 21:42
根本不是秒过,而是毫秒过

[oracle@redflag11012501 ~]$ vi mg.c

想想有时候一个复杂的sql,在c语言里面写出来就是很简单,看着清晰

使用道具 举报

回复
论坛徽章:
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
229#
 楼主| 发表于 2014-9-23 22:18 | 只看该作者
lugionline 发表于 2014-9-23 19:09
人肉有点困难,公式是在太复杂了,不是我等凡人能搞定的,但是程序算一下应当不困难吧,秒过

送你一个章,要哪个?


DECLARE  
   N INTEGER :=10;
   TYPE T_INT IS TABLE OF INTEGER INDEX BY PLS_INTEGER;
   TYPE T_INT2 IS TABLE OF T_INT INDEX BY PLS_INTEGER;
   c T_INT2;
   S integer :=0;
BEGIN
   FOR i IN 0..N+1 LOOP
       FOR j IN 0..10 LOOP
           c(i)(j):=0;
       end loop;
   END LOOP;
  
   for i IN  1..N LOOP
       for d IN 0..i-1 LOOP  -- d 位数, 拼上 (i - d) 个 k
             for j IN 1..9 LOOP
                 -- d 位数 以数字 j 结尾
                 for k IN 1..9 LOOP -- 拼上 (i - d) 个 k
                         if i - d > k THEN  continue; END IF;
                         if k = j THEN  continue; END IF;
                         C(i)(k) := C(i)(k) + C(d)(j);
                 end loop;
              end loop;
       end loop;
       for d in i..9 loop   -- 拼上 i 个 d
           C(i)(d):= C(i)(d)+1;
       end loop;
   end loop;
   
   for d in 0..9 loop
       S := S + C(N)(d);
   end loop;
   
   dbms_output.put_line(S);      
END;
/

3110771999

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.06

使用道具 举报

回复
论坛徽章:
737
季节之章:春
日期:2015-07-31 17:16:29ITPUB季度 技术新星
日期:2014-07-17 14:37:00季节之章:秋
日期:2015-07-31 17:16:14季节之章:夏
日期:2015-07-31 17:16:29股神
日期:2014-10-15 09:23:31衰神
日期:2014-10-20 22:47:12季节之章:冬
日期:2015-07-31 17:16:14红钻
日期:2014-12-16 17:51:41洛杉矶湖人
日期:2016-09-23 08:18:15布鲁克林篮网
日期:2016-09-23 08:17:18
230#
发表于 2014-9-23 22:32 | 只看该作者
还没用过二维数组, c(i)(j)

涨知识了。。。

使用道具 举报

回复

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

本版积分规则 发表回复

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