`
helloyesyes
  • 浏览: 1295798 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

SQL数据库编程大赛(第三期)

阅读更多

本期题目:
2011年度itpub数据库技术大会将于4月15日隆重举行。与会人员分布于不同城市(A,B,C,D,....),每个城市及其会员人数保存在一张表cities(city_name, members)
这些城市及他们之间的通路构成了一张网络交通图。有直接通路的两个城市及其距离保存在表routes之中,所有通路都是双向的,但每条直接通路只用一行记录来表示。
外地的会员将乘坐出租车参加大会,车费等于距离*价格(常数)。本地会员不用考虑交通费。

交通费定义:itpub要为外地会员发放往返的交通补贴,每人每公里2元(双程),在哪个城市举办能够最节省,需要花费多少钱?

问题:选择在哪个城市举行,能够使得会员的总交通费最低?列出这个城市及应发放给其他城市会员的总的交通补助。
输出格式如下:
输出3列数据,按城市名升序排列
举办城市  TOTAL   总费用
举办城市  来自城市   费用
....

例如,假设你求出在A城市最省,总的补助需要发放10000元,其中给B城市的会员要发8000, 给C城市的会员要发2000
输出

CODE:
A TOTAL 10000
A B 8000
A C 2000


如果存在在多个城市办会交通费用相同,则都列出,按城市名升序排列
例如,假设你求出在A,B城市最省,需要发10000元,如果在A办,B城市的会员8000, C城市的会员2000,如果在B办,A城市的会员8000, C城市的会员2000,
输出

CODE:
A TOTAL 10000
A B 8000
A C 2000
B TOTAL 10000
B A 8000
B C 2000


表结构和样例数据如下,样例数据供参考,评委将用多组数据验证你的解答。表结构不能变动,不按此表结构答题的不得分

CODE:
CREATE TABLE cities (
city_nameVARCHAR2(10) PRIMARY KEY
,members NUMBER
);
INSERT INTO cities
(
SELECT 'A' ,20 FROM dual union
SELECT 'B' ,31 FROM dual union
SELECT 'C' ,23 FROM dual union
SELECT 'D' ,42 FROM dual union
SELECT 'E' ,25 FROM dual union
SELECT 'F' ,29 FROM dual union
SELECT 'G' ,32 FROM dual union
SELECT 'H' ,45 FROM dual union
SELECT 'I' ,50 FROM dual union
SELECT 'J' ,32 FROM dual union
SELECT 'K' ,22 FROM dual
);
commit;

CREATE TABLE routes (
city1 VARCHAR2(10)
,city2 VARCHAR2(10)
,distance NUMBER
,PRIMARY KEY (city1,city2)
,CONSTRAINT check_cities CHECK (city1<city2) ---- 为了防止同一条通路被插入两遍
);
INSERT INTO routes
(
SELECT 'A' ,'B' , 71 FROM dual union
SELECT 'A' ,'C' , 80 FROM dual union
SELECT 'A' ,'D' , 80 FROM dual union
SELECT 'A' ,'E' , 66 FROM dual union
SELECT 'A' ,'F' , 86 FROM dual union
SELECT 'C' ,'G' ,112 FROM dual union
SELECT 'D' ,'G' , 60 FROM dual union
SELECT 'G' ,'H' ,102 FROM dual union
SELECT 'G' ,'I' , 91 FROM dual union
SELECT 'G' ,'J' ,133 FROM dual union
SELECT 'G' ,'K' ,127 FROM dual union
SELECT 'C' ,'D' , 79 FROM dual union
SELECT 'C' ,'H' ,155 FROM dual union
SELECT 'C' ,'E' ,119 FROM dual union
SELECT 'B' ,'D' , 52 FROM dual union
SELECT 'D' ,'I' , 44 FROM dual union
SELECT 'B' ,'L' , 41 FROM dual union
SELECT 'J' ,'L' ,201 FROM dual union
SELECT 'B' ,'F' , 79 FROM dual union
SELECT 'H' ,'K' , 38 FROM dual union
SELECT 'J' ,'K' , 81 FROM dual
);
commit;


数据库平台:适用Oracle、MS SQL Server,版本(Oracle推荐10gr2(包含)以上版本、MS SQL Sever推荐2008版本)

原文见:http://www.itpub.net/thread-1408182-1-1.html

参赛者答案:http://www.itpub.net/thread-1415335-1-1.html

我提交的答案:

/*
Oracle11gR2,使用递归with语法,运行时间0.05秒
allroutes 根据routes得出包括反方向的所有路径组合,
s子句是生成各个城市间的不同路径列表:
rn的作用主要用于判断循环,
root表示出发城市,
city2表示目标城市,
sum_dis 表示距离,
path表示路径,里面的内容如'A-B-C-D'这样的

where条件中instr(s.path,a.city2)<=0作用是不出现回路,即当发现a.city2(新路径的终点城市)已经在上一路径列表里则退出这一支路的递归
s.sum_dis+a.DISTANCE<
(select nvl(max(r.DISTANCE),999999) from routes r
where (s.root=r.city1 and a.city2=r.city2) or (s.root=r.city2 and a.city2=r.city1)
)
上面这个条件是取消路径小于routes中直线路径长度的后续检测,这里没有使用前面定义的allroutes是为了使用索引进行性能优化
grouping sets(city_name,(city_name,city2)这个子句用于分组统计总成本及各城市间成本。
*/

/*
Oracle10gR2,使用connect by语法,运行时间0.3秒
allroutes 根据routes得出包括反方向的所有路径组合,
CONNECT_BY_ROOT(city1) root表示出发城市,
city2表示目标城市,
sum_money_str表示路径距离的一个字符串,里面的内容如'000+080+082+091'这样的,
nocycle 用于终止循环路径,
CONNECT_BY_ROOT(city1) <> city2 优化用,当路径回到根节点时退出,
+use_merge(a,b) 优化用
与子查询select rownum rn from dual connect by rownum < (select count(*) from cities) 关联,用于计算sum_money_str的值
sum(substr(a.sum_money_str, (b.rn) * 4 + 1, 3)) distance用于计算sum_money_str值
grouping sets(city_name,(city_name,city2)这个子句用于分组统计总成本及各城市间成本。
*/

以下是结果:
ROOT NVL(CITY_NAME,'TOTAL') SUM(MONEY)
---------- ---------------------- ----------
D TOTAL 68356
D A 3200
D B 3224
D C 3634
D E 7300
D F 7598
D G 3840
D H 14580
D I 4400
D J 12352
D K 8228

解题思路:见上面的备注。

评委点评:where (s.root=r.city1 and a.city2=r.city2) or (s.root=r.city2 and a.city2=r.city1))
条件的优化思路很明确。性能很好。
但是此答案也存在瑕疵,11g版本答案能正确输出多种选择和多次转乘,但一个城市的名称包含另外一个城市名称时无法输出正确结果。另:10g版本答案在某些测试数据下输出错误。

个人分析:

1、这道题主要是考一个图路径的算法,我算法不好,所以也不管理论的东西,按自己的理解去做。

2、因为看到前两期有许多人用11gR2新的with递归语法,所以也尝试学习一下。感觉功能比以前强大,不过语法规则设计得太差,估计是ORACLE公司新来的人设计,只是实现了功能,没考虑开发人员的思维习惯,所以不看参考手册基本上用不来。

3、题目好像是说要满足10gR2的版本,不清楚为什么用11gR2的新语法不扣分,反而加分,这不符合实际应用,毕竟实战中通用性很重要。

4、如评委所说,未考虑到城市名称中有字符名含的问题,原因是提供的测试数据不存在包含的现象,所以忽略了,实际当中还是存在的。

5、SQL整体性能还不错,但是大数据量时估计性能不好。

总体来说,这期得分还算合理,个人感觉第4名(3-7)很精彩,根据图论基础算法使用Oracle10g的MODEL语法解题。

分享到:
评论

相关推荐

    SQL争霸赛试题及答案

    第三份文档"SQL争霸赛决赛试题.doc"与第一份文档相似,可能是决赛试题的详细说明,可能包含更复杂的问题或更高级的SQL概念,例如触发器、存储过程、视图或者索引的优化。决赛通常会提升难度,测试参赛者的综合能力和...

    第一届POLARDB数据库性能大赛-初赛第5名(JAVA)-复赛第7名(CPP).zip

    标题和描述提及的是"第一届POLARDB数据库性能大赛",这是一个针对阿里云POLARDB数据库性能的竞技活动。参赛者通过编写JAVA和CPP代码来优化数据库性能,初赛中以JAVA实现获得了第5名,复赛阶段转用CPP实现了第7名的...

    第一届PolarDB数据库性能大赛代码。Java语言实现.zip

    【标题】中的“第一届PolarDB数据库性能大赛代码”表明这是一个关于数据库性能优化的比赛项目,使用的编程语言是Java。PolarDB是阿里巴巴集团推出的一种高性能、高可用、云原生的分布式数据库产品,旨在为企业提供大...

    自己做的一个进销存系统开源用的是SQL数据库-易语言

    标题中的“自己做的一个进销存系统开源用的是SQL数据库-易语言”表明这是一个使用易语言编程开发的,基于SQL数据库的进销存管理系统,并且该系统已经开源。进销存系统是企业管理的重要组成部分,主要负责跟踪商品的...

    VB编程使用相关材料

    根据给定文件的信息来看,这份材料与VB编程、数据库、SQL等内容并无直接关联,主要涉及的是第十七届全国创新英语大赛决赛的相关事项说明。鉴于此,我们无法从中直接提取关于VB编程、数据库或SQL的具体知识点。然而,...

    第三届全国软件大赛决赛真题

    【第三届全国软件大赛决赛真题】是一场针对中国软件技术人才的重要竞赛,旨在检验和提升参赛者的编程技能、算法理解及问题解决能力。蓝桥杯作为该赛事的标签,表明了这一比赛与“蓝桥”这个知名的编程竞赛平台密切...

    第三届正保教育杯技能大赛预赛试卷

    【正保教育杯技能大赛】是一项旨在提升信息技术应用技术(ITAT)能力的全国性比赛,已成功举办至第三届。该赛事对于参赛者来说,不仅是一次检验自我技能水平的平台,也是展示才华、锻炼实操能力的重要机会。预赛试卷...

    第三届软件大赛选拔赛大纲.pdf

    - 不涉及数据结构、Swing等图形界面、HTML、JSP、Tomcat、开源框架、JDBC、SQL等Web开发和数据库编程方面的知识。 - 可使用JDK 1.5支持的所有特性。 - **Java本科组**: - 包含Java高职高专组的全部知识点。 - ...

    【GIS学习资料】第9届全国大学生 GIS 技能大赛下午试题详解

    在第9届全国大学生GIS技能大赛中,下午的试题可能涵盖了GIS技术的多个核心领域,包括空间数据处理、地图制图、空间分析、数据库管理以及GIS应用开发等。 1. **空间数据处理**:这部分可能涉及到矢量数据的编辑和...

    第八届蓝桥杯大赛个人赛省赛(软件类)真题

    【第八届蓝桥杯大赛个人赛省赛(软件类)真题】是针对计算机编程技能的一项竞赛,旨在考察参赛者的编程能力、算法理解和问题解决技巧。蓝桥杯比赛通常涵盖C/C++、Java、Python等主流编程语言,以及数据结构、算法...

    19届江西省电脑大赛题库

    【标题】"19届江西省电脑大赛题库"是一个针对信息技术领域的竞赛资料集合,它涵盖了江西省第19届电脑大赛的全部试题。这样的资源对于参赛者或是对信息技术感兴趣的学习者来说,是提升技能、了解比赛趋势的重要参考...

    “正保教育杯”全国ITAT教育工程就业技能大赛 Java试题

    甘肃省第二、第三届"正保教育杯"全国ITAT教育工程就业技能大赛的Java真题,无疑为学习者提供了宝贵的实战经验,有助于提高他们的编程水平。这些真题涵盖了Java的基础语法、面向对象编程、异常处理、集合框架、多线程...

    第46届世界技能大赛-网站设计与开发(武汉市)选拔试题

    【第46届世界技能大赛】是全球最高规格的职业技能竞赛,旨在提升青年技术人才的专业技能,推动职业技能的发展和创新。本次大赛中的【网站设计与开发】项目,着重考核参赛者在网页设计、前端开发以及网站构建方面的...

    第十五届蓝桥杯大赛知识点大纲

    以下是对第十五届蓝桥杯大赛知识点大纲的详细解析: 一、编程语言: 1. C/C++:这是基础语言,要求掌握基本语法、指针操作、内存管理以及STL(Standard Template Library)的使用。 2. Java:了解面向对象编程,...

    五步生成数据库完全版(易语言2005年大赛三等奖)-易语言

    第三步:数据操作 数据的增删改查(CRUD)是数据库管理的核心。在易语言中,可以使用“打开数据库”、“插入记录”、“更新记录”、“删除记录”等命令来实现这些功能。通过编程,用户可以动态地控制数据的输入、...

    第44届世界技能大赛广州选拔赛商务软件解决方案项目技术文件.pdf

    【商务软件解决方案项目】是第44届世界技能大赛广州选拔赛中的一个重要竞赛项目,旨在考核参赛者在软件开发领域的专业技能,特别是针对商务环境的软件解决方案设计与实施能力。项目涉及的技术范围广泛,包括软件分析...

    ITAT第六届全国信息技术应用水平大赛-B卷_复赛

    4. **数据库管理**:SQL语言、关系型数据库理论、数据库设计与优化、数据备份与恢复等。 5. **软件应用**:Office办公软件高级应用、图像处理软件(如Photoshop)、视频编辑软件等。 6. **信息安全**:密码学基础、...

    第十五届蓝桥杯大赛软件赛知识点大纲.pdf

    根据给定文件的信息,我们可以对第十五届蓝桥杯大赛软件赛的知识点进行详细解读。蓝桥杯是一项面向全国高校学生的计算机程序设计竞赛,旨在通过比赛的形式促进学生计算机能力的提升,激发其学习兴趣和创新能力。下面...

    第六届蓝桥杯大赛个人赛省赛(软件类)真题.zip

    "第六届蓝桥杯大赛个人赛省赛(软件类)真题.zip"是一个压缩包文件,里面包含了参加第六届蓝桥杯大赛个人赛省赛(软件类)的选手们所需要面对的实际试题。蓝桥杯大赛是一项专注于计算机软件和电子设计的竞赛,旨在...

    -c#数据库系统心得体会.doc

    c#数据库系统心得体会三: 数据库课程设计大赛的尘嚣渐渐远去,怀着对这次大赛的些许不舍,怀着对当初课程设 计开始时候的豪情万丈的决心的留恋,怀着通过这次课程设计积累的信心与斗志,我开 始写这篇文章,为自己...

Global site tag (gtag.js) - Google Analytics