|
原帖由 accelerator 于 2011-3-16 09:32 发表 ![]()
"第一届“盛拓传媒杯”SQL数据库编程大赛宗旨并非考核脑筋急转弯或高深的算法考核各位puber的算法能力,而且主要以PL/SQL的技巧和技能,以及对SQL新功能的掌握能力,性能优化能力,并附带考核对数据库体系结构的综合理解。题目均以oracle自带的HR或Scott示例数据库为平台。"
为什么这么多人都考虑到可以直接写 =2 ,而不用
我就是MN,哈哈,给你SHOW 下我的CODE(其实现在再回头来看,觉得后面求最大值的地方也不够严密的。。。)
with t as (
select 0 c1,0 c2,0 c3,0 c4,0 c5 from dual
union all
select 1 c1,0 c2,0 c3,0 c4,0 c5 from dual
union all
select 0 c1,1 c2,0 c3,0 c4,0 c5 from dual
union all
select 0 c1,0 c2,1 c3,0 c4,0 c5 from dual
union all
select 0 c1,0 c2,0 c3,1 c4,0 c5 from dual
union all
select 0 c1,0 c2,0 c3,0 c4,1 c5 from dual
union all
select 1 c1,1 c2,0 c3,0 c4,0 c5 from dual
union all
select 1 c1,0 c2,1 c3,0 c4,0 c5 from dual
union all
select 1 c1,0 c2,0 c3,1 c4,0 c5 from dual
union all
select 1 c1,0 c2,0 c3,0 c4,1 c5 from dual
union all
select 0 c1,1 c2,1 c3,0 c4,0 c5 from dual
union all
select 0 c1,1 c2,0 c3,1 c4,0 c5 from dual
union all
select 0 c1,1 c2,0 c3,0 c4,1 c5 from dual
union all
select 0 c1,0 c2,1 c3,1 c4,0 c5 from dual
union all
select 0 c1,0 c2,1 c3,0 c4,1 c5 from dual
union all
select 0 c1,0 c2,0 c3,1 c4,1 c5 from dual
--这个部分构造行不超过两个球的全部组合
)
select
rownum cnum,
c11||c12||c13||c14||c15||c21||c22||c23||c24||c25||c31||c32||c34||c35||c41||c42||c43||c44||c45||c51||c52||c53||c54||c55
as final_result
from (
select
a.c1+a.c2+a.c3+a.c4+a.c5+b.c1+b.c2+b.c3+b.c4+b.c5+c.c1+c.c2+c.c3+c.c4
+c.c5+d.c1+d.c2+d.c3+d.c4+d.c5+e.c1+e.c2+e.c3+e.c4+e.c5 csum,
a.c1 c11,
a.c2 c12,
a.c3 c13,
a.c4 c14,
a.c5 c15,
b.c1 c21,
b.c2 c22,
b.c3 c23,
b.c4 c24,
b.c5 c25,
c.c1 c31,
c.c2 c32,
c.c3 c33,
c.c4 c34,
c.c5 c35,
d.c1 c41,
d.c2 c42,
d.c3 c43,
d.c4 c44,
d.c5 c45,
e.c1 c51,
e.c2 c52,
e.c3 c53,
e.c4 c54,
e.c5 c55
from t a,
t b,
t c,
t d,
t e
--5表自JION 得到所有可能的解
where a.c1+b.c1+c.c1+d.c1+e.c1 <=2
and a.c2+b.c2+c.c2+d.c2+e.c2 <=2
and a.c3+b.c3+c.c3+d.c3+e.c3 <=2
and a.c4+b.c4+c.c4+d.c4+e.c4 <=2
and a.c5+b.c5+c.c5+d.c5+e.c5 <=2
--保证列不超过两个球
)
where c21+c12<=2
and c31+c22+c13<=2
and c41+c32+c23+c14<=2
and c51+c42+c33+c24+c15<=2
and c52+c43+c34+c25<=2
and c53+c44+c35<=2
and c54+c45<=2
and c41+c52<=2
and c31+c42+c53<=2
and c21+c32+c43+c54<=2
and c11+c22+c33+c44+c55<=2
and c12+c23+c34+c45<=2
and c13+c24+c35<=2
and c14+c25<=2
--上面是14条斜线不超过两个球
and csum = ( select max(csum)
--取满足条件的最大值
from
(
select
a.c1+a.c2+a.c3+a.c4+a.c5+b.c1+b.c2+b.c3+b.c4+b.c5+c.c1+c.c2+c.c3+c.c4
+c.c5+d.c1+d.c2+d.c3+d.c4+d.c5+e.c1+e.c2+e.c3+e.c4+e.c5 csum
from t a,
t b,
t c,
t d,
t e
where a.c1+b.c1+c.c1+d.c1+e.c1 <=2
and a.c2+b.c2+c.c2+d.c2+e.c2 <=2
and a.c3+b.c3+c.c3+d.c3+e.c3 <=2
and a.c4+b.c4+c.c4+d.c4+e.c4 <=2
and a.c5+b.c5+c.c5+d.c5+e.c5 <=2
)
)
order by 2 desc; |
|