楼主: 〇〇

[精华] Puzzleup 2010 比赛快开始了,大家用SQL解答啊

[复制链接]
论坛徽章:
1
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51
171#
发表于 2010-9-24 18:10 | 只看该作者
需要这么麻烦吗?
简单的推理就可以算出来^^
何必整这么乱七八糟的程序呢

使用道具 举报

回复
论坛徽章:
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
172#
发表于 2010-9-24 21:40 | 只看该作者
原帖由 nlrte13 于 2010-9-24 18:10 发表
需要这么麻烦吗?
简单的推理就可以算出来^^
何必整这么乱七八糟的程序呢

你有更简单的方法就贴出来嘛?
我那个方法用纸笔也可以完成,之所以用SQL是为了锻炼自己。
最后凑出d10~d1的过程,数值从大到小排列是个充分非必要条件,这也是可以推理的,因此可以把19~1从左边开始逐个去掉,很快就能试出来。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
173#
发表于 2010-9-24 21:51 | 只看该作者
原帖由 nlrte13 于 10-9-24 18:10 发表
需要这么麻烦吗?
简单的推理就可以算出来^^
何必整这么乱七八糟的程序呢


一个乐子而已嘛
说说看你是怎么推理的?


btw:欢迎来到Oracle开发版,一个潜水4年的老会员^_^

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
174#
发表于 2010-9-25 00:25 | 只看该作者
with t10 as (select 0-rownum a10 from dual connect by rownum<=23),
t9 as (select rownum-1 a9 from dual connect by rownum<=28),t8 as (select rownum-1 a8 from dual connect by rownum<=15),
t7 as (select rownum-1 a7 from dual connect by rownum<=11),t6 as (select rownum-1 a6 from dual connect by rownum<=9),
t5 as (select rownum-1 a5 from dual connect by rownum<=8),t4 as (select rownum-1 a4 from dual connect by rownum<=7)
select  a10, a9, a8, a7, a6, a5, a4, a10+a9+a8+a7+a6+a5+a4 Q,
         rank()over(order by a10+a9+a8+a7+a6+a5+a4 asc, a10 desc, a9 desc, a8 desc, a7 desc) rk from t10, t9, t8, t7, t6, t5, t4
where 19*a10+17*a9+15*a8+13*a7+11*a6+9*a5+7*a4=22
and a9>=a8 and a8>=a7 and a7>=a6 and a6>=a5 and a5>=a4
/

   A10     A9     A8     A7     A6     A5     A4      Q     RK
------ ------ ------ ------ ------ ------ ------ ------ ------
    -3      3      1      1      0      0      0      2      1
    -4      4      2      0      0      0      0      2      2
    -5      6      1      0      0      0      0      2      3
    -6      8      0      0      0      0      0      2      4
    -5      2      2      2      1      1      1      4      5
    -6      3      3      1      1      1      1      4      6
    -7      5      2      1      1      1      1      4      7
    -7      4      2      2      2      1      0      4      8
    -7      3      3      3      1      1      0      4      9
    -8      7      1      1      1      1      1      4     10
    -8      4      4      2      1      1      0      4     11

   A10     A9     A8     A7     A6     A5     A4      Q     RK
------ ------ ------ ------ ------ ------ ------ ------ ------
    -8      4      3      3      2      0      0      4     12
    -9      6      3      2      1      1      0      4     13
    -9      5      5      1      1      1      0      4     14
    -9      5      4      2      2      0      0      4     15
   -10      8      2      2      1      1      0      4     16
   -10      7      4      1      1      1      0      4     17
   -10      7      3      2      2      0      0      4     18
   -10      6      4      3      1      0      0      4     19
   -10      5      5      4      0      0      0      4     20
   -11      9      3      1      1      1      0      4     21
   -11      9      2      2      2      0      0      4     22

   A10     A9     A8     A7     A6     A5     A4      Q     RK
------ ------ ------ ------ ------ ------ ------ ------ ------
   -11      8      3      3      1      0      0      4     23
   -11      7      5      2      1      0      0      4     24
   -11      7      4      4      0      0      0      4     25
   -11      6      6      3      0      0      0      4     26
   -12     11      2      1      1      1      0      4     27
   -12      9      4      2      1      0      0      4     28
   -12      8      6      1      1      0      0      4     29
   -12      8      5      3      0      0      0      4     30
   -12      7      7      2      0      0      0      4     31
   -13     13      1      1      1      1      0      4     32
   -13     11      3      2      1      0      0      4     33
..............
   -23      8      7      7      6      6      1     12    566
   -23      8      6      6      6      6      5     14    568

已选择568行。

已用时间:  00: 00: 07.78



可知最小的Q为2,共有4种方案可选
任选其中一种,代入到
{x20,x19,x18,...x1}={212,19,18,...1}
然后除去x8~x13中任意五个数,再计算即可得到3540。


newkid给出了三种,我给出了一种,正好将这四种情况都覆盖到了
注意,newkid列出的那三种情况是按d给出的,即差值
我这里求的是a,是与最初设定的xn的偏移量,对xn作修正用的

使用道具 举报

回复
论坛徽章:
1
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51
175#
发表于 2010-9-25 09:40 | 只看该作者
原帖由 lastwinner 于 2010-9-24 21:51 发表


一个乐子而已嘛
说说看你是怎么推理的?


btw:欢迎来到Oracle开发版,一个潜水4年的老会员^_^


哈哈,不知不觉的,都4年过去了,怀念曾经年少轻狂的日子呀。
话说,前辈都已经在此霸版8年之久了啊。。。

简单说说我的“策略”吧
对于20数的情况,
19A + 17B + 15C + 13D + 11E + 9F + 7G +5H + 3I + J -
K - 3L - 5M - 7N - 9O - 11P - 13Q - 15R - 17S -19T = 5000                      ---------1
对于15数,有
14A + 12B + 10C + 8D + 6E + 4F + 2G - 2N - 4O - 6P - 8Q - 10R - 12S - 14T = ?                 ------------2
两算式之差为
5A + 5B + 5C + 5D + 5E + 5F + 5G + ( 5H + 3I + J - K - 3L - 5M ) -
5N - 5O - 5P - 5Q - 5R - 5S - 5T = ?       -------------3

欲使3式最小,可令 5A 到 5G 部分尽可能小,亦可令 -5N 到 -5T 部分尽可能大,亦或二者皆为之。
另由1式知,3式的 5A 到 5G 部分与 -5N 到 -5T 部分变换对等,且 5H 到 -5M 部分的内变换对结果值无影响。
所以可简化为求
A + B + C + D + E + F + G        -----------4
的最小值。

尝试
20(A),19(B),18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1
A增量193的情况,1式 = 4997,
要使 A = 20 + 193 减小,而令 B + C + D + E + F + G 增大,使1式 = 5000,
由于A的系数19,大于 BCDEFG 的系数,
那么总增量必然大于 193,
容易得到
20+193-7(A),19+8(B),18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1
这个结果,
总增量194(大于193的最小数),即为所求。
由此,得到2式结果为3540,即为最大值。

使用道具 举报

回复
论坛徽章:
1
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51
176#
发表于 2010-9-25 09:57 | 只看该作者
前一题就更简单啦
26 + 26 * 25 / 2 * 4 + 26 * 25 * 24 / 2 / 3 * 5 * 3 + 26 * 25 * 24 * 23 / 2 / 3 / 4 * 8 =
26 + 1300 + 39000 + 119600 =
159926

始终觉得,思想,方法,才是最重要的,编程,只是个实现手段啦~ ^^

使用道具 举报

回复
论坛徽章:
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
177#
 楼主| 发表于 2010-9-25 10:02 | 只看该作者

回复 #175 nlrte13 的帖子

如何证明把中间的5个删除可得到最大值?

使用道具 举报

回复
论坛徽章:
1
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51
178#
发表于 2010-9-25 10:18 | 只看该作者
上上题,容易得出第一列为 8,6,4,
第三列9,7,5
接下来不用思考随便试试也能得出结果:
6 3 7
8 0 9
4 2 5
----------------
63*80*42 = 211680

使用道具 举报

回复
论坛徽章:
1
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51
179#
发表于 2010-9-25 10:20 | 只看该作者
原帖由 〇〇 于 2010-9-25 10:02 发表
如何证明把中间的5个删除可得到最大值?


既然在中间,就是说既不大,也不小
用中间的和左边大点的互换,会使结果值变小,
和右边小点的互换,也会使结果值变小,
那自然是要去掉的咯~

使用道具 举报

回复
论坛徽章:
1
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51
180#
发表于 2010-9-25 10:30 | 只看该作者
看了你们的代码,感觉挺过瘾,心中痒痒的^^
可我还是零经验的新手呐。。。

鹦鹉哥,马利奥哥,有好的又简单易懂的初级读本推荐么?
我也想写写那些代码玩^^

使用道具 举报

回复

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

本版积分规则 发表回复

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