楼主: tree_new_bee

[精华] Euler Project 挨个做- 之三 (Q79-?)

[复制链接]
论坛徽章:
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
31#
发表于 2016-11-30 16:19 | 只看该作者
这样更好
with t as(select level-1 l from dual connect by level<=10),
t1(a,p,lv) as(select l,power(2,l),1 from t
union all
select l,p+power(2,l),lv+1 from t1,t where a<l and lv<6),
a as(select p ,decode (bitand(p,64+512),64,p+512,512,p+64,p)pa from t1 where lv=6), --p actual ,pa expand
b as(select p,pa pb from a),
s as(select power(2,floor(level*level/10))s1,
power(2,mod(level*level,10))s2 from dual connect by level<=9),
j as(select pa,pb from a,b where pa<pb and not exists(select 1 from s where bitand(pa,s1)*bitand(pb,s2) =0
and bitand(pa,s2)*bitand(pb,s1)=0))
select count(*) from (
select pa,pb from j
);

使用道具 举报

回复
论坛徽章:
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
32#
发表于 2016-11-30 20:21 | 只看该作者
数长方形

如果数得足够仔细,能看出在一个3乘2的长方形网格中包含有18个不同大小的长方形,如下图所示:

如图 enter image description here
尽管没有一个长方形网格中包含有恰好两百万个长方形,但有许多长方形网格中包含的长方形数目接近两百万,求其中最接近这一数目的长方形网格的面积。

思路
以图中长方形为例,有4条竖线,3条横线,其中两对横线和两对竖线能组成1个长方形,横线间的差就是长方形的高度,竖线之差就是宽度。用SQL表示如下:
with x as(select level x from dual connect by level<=4),
y as(select level y from dual connect by level<=3)
select (x2.x-x1.x)width,(y2.y-y1.y)hight,count(*)
from x x1,x x2,y y1,y y2
where x2.x>x1.x and y2.y>y1.y
group by (x2.x-x1.x),(y2.y-y1.y)
order by 1,2;

WIDTH      HIGHT   COUNT(*)
----- ---------- ----------
    1          1          6
    1          2          3
    2          1          4
    2          2          2
    3          1          2
    3          2          1
分析
1x1 : (4-1)(3-1) =6
1x2 : (4-1)(3-2) =3

2x1 : (4-2)(3-1) =4
2x2 : (4-2)(3-2) =2

3x1 : (4-3)(3-1) =2
3x2 : (4-3)(3-2) =1

=(4-1)(3*2-sum(1->2))
+(4-2)(3*2-sum(1->2))
+(4-3)(3*2-sum(1->2))


=(4*3-sum(1->3))(3*2-sum(1->2))
=(12-6)*(6-3)
=18
把4 和 3 用m 和 n代替

可以推测:
对于m*n的长方形,和为
(m*(m-1)-(1+m-1)*(m-1)/2))
*(n*(n-1)-(1+n-1)*(n-1)/2))
=m(m-1)n(n-1)/4
如果把直线根数改成长方形的宽度和高度 则
和=m(m+1)n(n+1)/4
设m是宽度和高度中较大者
则和必<=(m(m+1)/2)^2且>=(n(n+1)/2)^2
面积=mn,和最接近20000,实际就是求mn的最小值

解不等式m*m+m-2sqrt(2000000)>=0,
m>=方程m*m+m-2sqrt(2000000)=0的较大的根 1/2(-1+sqrt((1+4*2000sqrt(2))
SQL> select 1/2*(-1+sqrt(1+4*2000*sqrt(2)))a from dual;

         A
----------
52.6853093
所以m最小值是53,n最大值是53
with m as(select level+52 m from dual connect by level<=100),
n as(select level n from dual connect by level<=53)
select min(m*(m+1)*n*(n+1)/4-2e6) a from m,n where abs(m*(m+1)*n*(n+1)/4-2e6)<=1000;

     A
------
    -2


with m as(select level+52 m from dual connect by level<=100),
n as(select level n from dual connect by level<=53),
min_diff as(select min(m*(m+1)*n*(n+1)/4-2e6) a from m,n where abs(m*(m+1)*n*(n+1)/4-2e6)<=1000)
select m,n,m*n from m,n where m*(m+1)*n*(n+1)/4-2e6=(select a from min_diff);

     M          N        M*N
------ ---------- ----------
    77         36       2772
有些不完美的地方,不知道怎么证明-2是最接近的。

使用道具 举报

回复
论坛徽章:
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
33#
发表于 2016-11-30 20:25 | 只看该作者
〇〇 发表于 2016-11-30 20:21
数长方形

如果数得足够仔细,能看出在一个3乘2的长方形网格中包含有18个不同大小的长方形,如下图所示: ...


这是85题

p85.gif (6.67 KB, 下载次数: 66)

p85.gif

使用道具 举报

回复
论坛徽章:
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
34#
发表于 2016-11-30 20:45 | 只看该作者
就从1、-1开始测试
with m as(select level+52 m from dual connect by level<=100),
n as(select level n from dual connect by level<=53),
min_diff as(select min(m*(m+1)*n*(n+1)/4-2e6) a from m,n where abs(m*(m+1)*n*(n+1)/4-2e6)<=1000)
select m,n,m*n from m,n where m*(m+1)*n*(n+1)/4-2e6 in (1,-1,2, -2)
;

    M          N        M*N
----- ---------- ----------
   77         36       2772

使用道具 举报

回复
论坛徽章:
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
35#
发表于 2016-11-30 23:05 | 只看该作者
25楼,我没用二进制:

WITH s AS (
SELECT str
      ,CASE WHEN INSTR(str,'6')>0 AND INSTR(str,'9')=0 THEN str||'9'
            WHEN INSTR(str,'6')=0 AND INSTR(str,'9')>0 THEN str||'6'
            ELSE str
       END str2
  FROM (SELECT SYS_CONNECT_BY_PATH(c,',') str
         FROM (SELECT LEVEL-1 c FROM DUAL CONNECT BY LEVEL<=10)
        WHERE LEVEL=6
       CONNECT BY NOCYCLE PRIOR c<c
       )
)
,p AS (SELECT TRUNC(LEVEL*LEVEL/10) c1, MOD(LEVEL*LEVEL,10) c2 FROM DUAL CONNECT BY LEVEL<10)
SELECT COUNT(*)
  FROM s s1,s s2
WHERE s1.str<s2.str
       AND NOT EXISTS (SELECT 1 FROM p WHERE NOT (INSTR(s1.str2,p.c1)>0 AND INSTR(s2.str2,p.c2)>0
                                                  OR INSTR(s2.str2,p.c1)>0 AND INSTR(s1.str2,p.c2)>0
                                                 )
                      );

  COUNT(*)
----------
      1217

使用道具 举报

回复
论坛徽章:
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
36#
发表于 2016-12-1 10:22 | 只看该作者
newkid 发表于 2016-11-30 23:05
25楼,我没用二进制:

WITH s AS (

instr的效率也很好

使用道具 举报

回复

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

本版积分规则 发表回复

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