锁定老帖子 主题:2007年百度程序设计大赛其中一题之我解!
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-08-30
题目是2007年百度程序设计大赛的第二题。
***********************************************************************
2.大话西游与数字游戏
“叉烧鸡翅膀,我呀最爱吃!……”
百度spider组的“黑龙潭之行”在烤着鸡翅,唱着星爷的经典时达到高潮。大家在篝火旁围成一圈,开始玩“数7”加强版游戏,规则如下:
规则1:遇7的倍数或含7的数时pass。
规则2:遇有包含相同数字的数时pass。注意相同数字不必相邻。例如121。
数错的惩罚很残酷——吞食烤全羊。为避免惩罚,百度工程师们需要你——史上最强程序员的帮助。百度工程师想知道:
req1 x:符合规则1的第x个数是什么?
req2 y:符合规则2的第y个数是什么?
req12 z:同时符合规则1、2的第z个数是什么?
query n:数n是规则1中的第几个数,是规则2中的第几个数?
输入格式
输入的每一行为一个查询,由一个查询词和一个无符号整型数组成。共有四种查询,查询词分别为req1、req2、req12、query(区分大小写)。
输出格式
前三种查询输出一个无符号整型的解。对于“query n”的查询,若n是规则中的数则输出相应的解,否则输出-1。
输入样例 例
req1 10
req2 10
req12 10
query 14
输出样例 例
11
10
12
-1 13
评分规则
程序将运行在一台Linux机器上(内存使用不作严格限制),在每一测试用例上运行不能超过1秒,否则该用例不得分;
要求程序能按照输入样例的格式读取标准输入数据,按照输出样例的格式将运行结果输出到标准输出上。如果不能正确读入数据和输出数据,该题将不得分;
该题目共有10个测试数据集,其中数据1~5主要考查正确性,满足x,y,z,n<=1000;输入6~10主要考查时间效率,满足x<=10,000,000,y<=1,000,000,z<=240,000,n<=20,000,000。数据1和6只包含req1,数据2和7只包含req2,数据3和8只包含req12,数据4和7只包含query,数据5和10包含全部四种查询。每组数据都恰好包含100个查询。
该题目20分。
*********************************************************************
由于闲麻烦没有写IO读取文件的过程。
以下是我写的程序,编写的时第三问,即同时满足以上两个条件。经过数量为100000的用例测试,用时5秒。
java 代码
呵呵,其实挺容易的,计算机专业的一般都写的出。就是用时难把握,由于本例是用java语言编写,故用时较多,改写为C/C plus plus 的话,应该能够满足1秒的条件。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-08-30
楼主的解法好像比较暴力,其实规则2的那个题可以用排列组合+逼近来解决. 这个问题在数字的位数大于10时就没有意义了, 记 P(n) 为 [power(10, n-1), power(10, n)) 之间 符合规则2的数的个数 1. [0, 10)之间是没有这样的数的. 也就是P(1) = 0 9. 在解决[req12 z:同时符合规则1、2的第z个数是什么?]这样的问题时
附注: 把abcd 切成 abc d分析起来应该更方便
|
|
返回顶楼 | |
发表时间:2007-08-30
这个思路我确实做确实没有想到过(大学没选学概率统计,想不到有这么多好处)。我曾经尝试过多次用例测试,发现200000 与 100000的运行时间相差很多,这应该是当数字变大时进行比较时递归太耗时了。我想你这个方法应该能够解决我的这个问题(除非天文数字),如果数字太大后面的递归也比较耗时,但足够满足需求了。
|
|
返回顶楼 | |
浏览 2620 次