oracle数据库大赛,分享一下SQL数据库编程大赛第一期我的解法

var N number

exec :N :=2

WITH

linesrc as (

select col1||col2||col3||col4||col5  strings,

col1+col2+col3+col4+col5 balls,

r.*

from (

select

mod(floor(rownum/16),2)  col1 ,

mod(floor(rownum/8),2)  col2 ,

mod(floor(rownum/4),2)  col3 ,

mod(floor(rownum/2),2)  col4 ,

mod(floor(rownum),2)  col5

from  dual

connect by rownum <=32

) r

where col1+col2+col3+col4+col5<=:N

ORDER BY 1 desc

),

probed_result  as (

select

max(line1.balls + line2.balls + line3.balls + line4.balls + line5.balls) probed_max_balls

from

linesrc line1,

linesrc line2,

linesrc line3,

linesrc line4,

linesrc line5

where

line1.col1 + line2.col1 + line3.col1+ line4.col1+ line5.col1 <=:N

and line1.col2 + line2.col2 + line3.col2+ line4.col2+ line5.col2 <=:N

and line1.col3 + line2.col3 + line3.col3+ line4.col3+ line5.col3 <=:N

and line1.col4 + line2.col4 + line3.col4+ line4.col4+ line5.col4 <=:N

and line1.col5 + line2.col5 + line3.col5+ line4.col5+ line5.col5 <=:N

and line1.col1 + line2.col2 + line3.col3+ line4.col4+ line5.col5 <=:N

and line1.col2 + line2.col3 + line3.col4+ line4.col5 <=:N

and line1.col3 + line2.col4 + line3.col5<=:N

and line1.col4 + line2.col5 <=:N

and line2.col1 + line3.col2 + line4.col3+ line5.col4 <=:N

and line3.col1 + line4.col2 + line5.col3 <=:N

and line4.col1 + line5.col2 <=:N

and line1.col5 + line2.col4 + line3.col3+ line4.col2+ line5.col1 <=:N

and line1.col4 + line2.col3 + line3.col2+ line4.col1 <=:N

and line1.col3 + line2.col2 + line3.col1 <=:N

and line1.col2 + line2.col1 <=:N

and line2.col5 + line3.col4 + line4.col3+ line5.col2<=:N

and line3.col5 + line4.col4 + line5.col3<=:N

and line4.col5 + line5.col4 <=:N

and rownum < power(10,:N)*2

),

probed_linesrc AS (

select *

from linesrc,probed_result

where balls>= probed_max_balls-4*:N  -- 最少要probed_max_balls才能符合要求,但是每一行最多N个ball, 所以每一行至少probed_max_balls-4*N

),

solution as (

select /*+ materialize */

line1.strings || line2.strings || line3.strings || line4.strings || line5.strings result ,

line1.balls + line2.balls + line3.balls + line4.balls + line5.balls total_balls

from

probed_linesrc line1,

probed_linesrc line2,

probed_linesrc line3,

probed_linesrc line4,

probed_linesrc line5

where

line1.col1 + line2.col1 + line3.col1+ line4.col1+ line5.col1 <=:N

and line1.col2 + line2.col2 + line3.col2+ line4.col2+ line5.col2 <=:N

and line1.col3 + line2.col3 + line3.col3+ line4.col3+ line5.col3 <=:N

and line1.col4 + line2.col4 + line3.col4+ line4.col4+ line5.col4 <=:N

and line1.col5 + line2.col5 + line3.col5+ line4.col5+ line5.col5 <=:N

and line1.col1 + line2.col2 + line3.col3+ line4.col4+ line5.col5 <=:N

and line1.col2 + line2.col3 + line3.col4+ line4.col5 <=:N

and line1.col3 + line2.col4 + line3.col5<=:N

and line1.col4 + line2.col5 <=:N

and line2.col1 + line3.col2 + line4.col3+ line5.col4 <=:N

and line3.col1 + line4.col2 + line5.col3 <=:N

and line4.col1 + line5.col2 <=:N

and line1.col5 + line2.col4 + line3.col3+ line4.col2+ line5.col1 <=:N

and line1.col4 + line2.col3 + line3.col2+ line4.col1 <=:N

and line1.col3 + line2.col2 + line3.col1 <=:N

and line1.col2 + line2.col1 <=:N

and line2.col5 + line3.col4 + line4.col3+ line5.col2<=:N

and line3.col5 + line4.col4 + line5.col3<=:N

and line4.col5 + line5.col4 <=:N

)

select rownum  r,result from solution

where total_balls = (select max(total_balls) from solution)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值