2007年百度之星复赛试题

百度之星2007程序设计大赛复赛于今日21:00顺利结束。复赛有4题,共1000分。某位参赛选手为我站提供了复赛的4道题目,现在全部公布出来,让更多的百度爱好者和编程爱好者进行共享和交流。感谢该热心网友对我站的支持和帮助!

1.好心的出租车司机

北京的一位出租车司机向你抱怨:城市发展太快,公路越来越多,他已经疲于计算行驶路线,于是求助你开发一个自动导航的工具。
出租车只能在公路上行驶。所有的公路都是笔直、双向的,相交的公路视为连通(可以在交叉点处从一条公路开到另一公路上)。由于道路施工,整个城市的公路系统可能并不完全通畅。如果乘客的目的地不在公路边,则乘客下车后要步行前往,步行路线不受公路限制。这位好心的司机还特别提出,乘客步行距离越短越好;其次,出租车行驶里程越短越好。
方便起见,用笛卡儿坐标系来描述城市地图,所有坐标都在第一象限[0, 10000]的范围内。公路宽度忽略不计。

输入格式
第一行是一个正整数k,代表公路条数。以下k行每行用4个非负整数描述一条公路(用空格隔开),前两个表示公路起点的坐标,后两个表示公路终点的坐标。下一行包含4个非负整数(用空格隔开),前两个表示乘客上车点(保证在某条公路上),后两个表示乘客目的地坐标。

输出格式
仅一行,为出租车行驶的里程数,保留一位小数(四舍五入)。

输入样例
2
2 2 10 10
10 2 2 10
3 3 9 4

输出样例
7.8

评分规则

  1. 程序将运行在一台Linux机器上(内存使用不作严格限制),在每一测试用例上运行不能超过1秒,否则该用例不得分;
  2. 要求程序能按照输入样例的格式读取标准输入数据,按照输出样例的格式将运行结果输出到标准输出上。如果不能正确读入数据和输出数据,该题将不得分;
  3. 本题包含20个测试点,前10组满足k<=10,后10组满足k<=50。每个测试点10分,共200分。
2.Robots.txt 协议

搜索引擎是靠Web Robot(又称Spider)来收集互联网上浩如烟海的网页的。Spider就像一个旅行家一般,不知疲倦地奔波于万维网的空间,将遇到的页面收集下来供搜索引擎索引。对于一个网站的管理员来说,如果想指定某些不希望搜索引擎访问的内容,该如何去做呢?他需要的就是Robots Exclusion Protocol协议,这里简单的称它做Robots.txt协议。

Robots.txt是一个放置在网站根目录下的纯文本文件。举例来说,当Spider访问一个网站(比如http://www.example.com)时,首先会检查该网站中是否存在http://www.example.com/robots.txt这个文件,如果Spider找到这个文件,它就会根据这个文件的内容,来确定它访问权限的范围。

http://www.robotstxt.org/是robots.txt协议的Home Page,在这个站点上你可以找到很多robots.txt协议相关的资料。Robots.txt协议在http://www.robotstxt.org/wc/norobots.html本地拷贝)上有比较详尽的描述。

你的任务就是编写Spider中的一个逻辑单元,用来判断一个网站的一些URL是否被禁止抓取。对方网站的站点在这里假设是www.example.com,这个Spider的User-agent当然是Baiduspider。注意,这个逻辑单元除了本身的判断逻辑要求与robots.txt协议一致外,还要注意容错的问题。互联网上纷繁芜杂,会出现很多意想不到的错误。如何能够对一个对错参半的robots.txt进行解析,把其中正确的挑拣出来、把错误的部分忽略掉,也是一个不小的挑战哦。都会遇到什么错误?在开始爬行互联网之前,谁都不知道。

输入格式
第一行是一个非负整数m,表示robots.txt文件的行数,后面跟m行,是robots.txt的全文。下一行包含一个非负整数n, 表示URL的行数,后面跟n行URL,这个就是你要判断的URL的列表。

输出格式
每条URL输出一行,每行两列,第一列是一个数字,如果这条URL被禁止,则输出0,否则输出1。第二列是这条URL本身。两部分以一个空格隔开。

样例输入
2
User-agent: *
Disallow: /tmp/
2
http://www.example.com/index.html
http://www.example.com/tmp/somepage.html

样例输出
1 http://www.example.com/index.html
0 http://www.example.com/tmp/somepage.html

评分规则

  1. 程序将运行在一台Linux机器上(内存使用不作严格限制),在每一测试用例上运行不能超过1秒,否则该用例不得分;
  2. 要求程序能按照输入样例的格式读取标准输入数据,按照输出样例的格式将运行结果输出到标准输出上。如果不能正确读入数据和输出数据,该题将不得分;
  3. 本题包含20个测试点,均满足0<=n,m<=100。本题每个测试点10分,共200分。

3.简单印象

简单、可依赖是百度的性格,百度之星们又有怎样的性格呢?

有n名选手入围了百度之星程序设计大赛的复赛阶段。为了让选手相互之间有更多的了解和更好的交流,组委会工作人员邀请每位选手选择一些不同的词语来介绍自己的性格。每名选手需要为自己选定的每一个词语指定一个绝对值不超过100的整数权值q,表示这个词语在多大程度上描述了自己的性格。例如“美丽 90”表示该选手认为自己非常美丽,“冷淡 -60”表示比较热情,而“外向 -5”表示稍微有一点点偏内向。你不需要考虑词语本身的语义,比如“外向 -5”不代表“内向 5”。

组委会发现不少选手的性格都有相似之处,所以希望找到一组词语尽量准确的描述所有的选手。对于选出的词语集合S,定义选手i被描述的精确程度P(i)为S中所有词语在选手i眼中的权值之和(选手i没有提到的词权值视为0),组委会希望让最小的P(i)尽量大,因为这样才能让选出的词语能够描述所有选手,而不仅仅是部分。

另外,所选词语的个数也是有讲究的。词语太少会略显单薄,而词语太多又不方便宣传,所以组委会设定了词语个数的最小值min和最大值max。

 

输入数据
输入数据第一行为三个非负整数n, min和max,表示选手的个数、词语数的最小值和最大值,接下来的n行,每行包括若干“词语-权值”对(用空格隔开)。词语保证由不超过10个汉字组成(用GBK编码,不含非汉字),权值为绝对值不超过100的整数。

输出数据
仅一行,输出各个词语,用空格隔开。词语总数必须不小于min且不大于max,每个词语都必须至少被一个选手提到过,否则视为非法输出。你的输出不必是最优的,只要输出合法,就能得到一定的分数。

输入样例
3 2 4
美丽 90 冷淡 -60 外向 -5 乐观 20
美丽 10 冷淡 20
外向 20 乐观 -5

输出样例
美丽 冷淡 外向

样例解释
如果把选手按照输入中出现的顺序编号为1~3,则P(1)=90-60-5=25,P(2)=10+20=30,P(3)=20,所有P中的最小值为20。

注意事项
输入数据的中文采用GBK编码
GBK:是又一个汉字编码标准,全称《汉字内码扩展规范》。采用双字节表示,总体编码范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间,排除xx7F。总计 23940 个码位,共收入 21886 个汉字和图形符号,其中汉字(包括部首和构件)21003 个,图形符号 883 个。

评分规则

  1. 程序将运行在一台Linux机器上(内存使用不作严格限制),在每一测试用例上运行不能超过2秒,否则该用例不得分;
  2. 要求程序能按照输入样例的格式读取标准输入数据,按照输出样例的格式将运行结果输出到标准输出上。如果不能正确读入数据和输出数据,该题将不得分;
  3. 本题包含30个测试点,每个测试点10分,共300分。
    测试点1~10满足n<=100, 1<=min<=max<=5, 涉及到的词语不超过500个。
    测试点11~20满足n<=200, 10<=min<=max<=15, 涉及到的词语不超过2000个。
    测试点21~30满足n<=400, 25<=min<=max<=30, 涉及到的词语不超过10000个。
    每个测试点独立评分。对于每个测试点,你的得分不仅取决于你的输出,还取决于其他选手的输出。非法输出的得分为0,合法输出的得分大于0。设合法输出的程序数为M,比程序i的方案严格更优的程序数为Y(i),则该测试点程序i的分值为10(1-Y(i)/M)。换句话说,输出该测试点最优解的程序将获得10分,而最差解惟一的情况,输出最差解(但合法)的选手将得到10/M分。注意:每个测试点的得分不一定为整数。

4.紧急修复

2050年的一天,某市k家公司的计算机系统突然同时瘫痪。市政府很快找到了问题的所在,并开始研发一套自动修复系统。该系统启用后整个城市的计算机系统将恢复正常,但由于研发时间较长,在此之前各公司仍将蒙受不小的损失。为此,市政府决定派出n支维修能力相同的维修队到各公司进行手工修复,力图在系统启用前将整个城市的总损失降低到最小限度。

城市被划分成R*C的网格,各行从上到下编号为1~R,各列从左到右编号为1~C。每个格子为空地、障碍物和建筑物之一(公司总是位于某个建筑物格子中,且不同的公司总是在不同的建筑物格中)。维修队每次只能往上(行编号减1)、下(行编号加1)、左(列编号减1)、右(列编号加1)四个方向移动,第i支维修队每个小时可以移动s(i)格。维修队在任何时候都不能位于障碍物中,但建筑物可以从它上下左右的相邻空地进入,也可以从这些格子出去。注意:不能直接从一个建筑物格移动到另一个建筑物格,而必须先移动到相邻的空地,在空地上移动,然后再进入另一个建筑物。每个格子的实际尺寸很大,因此可以有多个维修队同时在同一个格子中。第i家公司的位置为(r(i), c(i)),瘫痪程度为B(i),每小时的经济损失为P(i)元。瘫痪程度的单位是“队·小时”,即一支维修队每小时可以把一个公司的瘫痪程度降低1,而如果m支维修队同时为一个公司修复,每小时可以把该公司的瘫痪程度降低m。注意,在完全修复之前,每个小时的经济损失不变。

政府的修复计划应包含每个小时各维修队所执行的命令。这些命令包括:

1. REST
该命令不进行任何操作。

2. MOVE
按照seq进行移动。其中seq为一个长度不超过s(i)的非空字符串(如果不需要移动,请使用REST命令)。如果seq的长度超过s(i),则从第s(i)+1个字符开始的剩余部分将被删除;如果该命令不能完全成功的执行,则从第一个非法移动开始的所有后续移动将被忽略。 seq的取值范围为:U,D,L,R。分别表示上、下、左、右。字符区分大小写, 其他字符视为非法。

3. REPAIR
对当前公司进行维修。如果当前公司已经修复或者该维修队的当前位置不是公司,该命令将被忽略。该命令后面加的所有参数将被忽略。

需要特别注意的是,每个小时只能执行一条指令,例如不能在MOVE之后立刻REPAIR,必须等待下一个小时。

输入格式
输入的第一行为三个正整数R, C, T即网格的行数、列数和自动修复系统的启用时间。以下R行每行C个字符,表示该城市的地图。点表示空地,#表示障碍物,O表示建筑物。 下一行包含一个正整数k,表示公司的数目。以下k行每行四个整数r, c, B, P,其中(r,c)表示该公司坐标(1<=r<=R, 1<=c<=C),B为该公司的初始瘫痪程度,P为每小时的经济损失。(r,c)处保证为一个建筑物格。B和P均为正整数,且P不超过200。 下一行包含两个正整数n, s,表示维修队的个数和每小时最多移动的格子数。以下n行每行包含两个整数r, c,表示该维修队的初始位置。维修队按照输入文件中的顺序编号为1~n。

输出格式
输出每n行为一组,描述一个小时各维修队的发出的命令。共T组,一共n*T行。所有格式非法的指令将被忽略(等效于REST)。尽管如此,如果程序输出不足n*T行,或者命令中没有REPAIR,或者所有的REPAIR都没有成功执行,则输出将视为非法。你的程序不必输出最优解,任何一个合法解都将得到一定的分数。

输入样例
4 7 5
...#OO#
#.....#
O...##O
#......
2
1 5 1 5
3 7 4 6
3
4 7 5
1 1 5
3 1 5

输出样例
MOVE U
MOVE RRRD
MOVE RDRURD
REPAIR
MOVE DRRU
MOVE DRRRU
REPAIR
REPAIR
REPAIR
REPAIR
MOVE DRUL
REPAIR
SLEEP
REPAIR
REST

模拟器

为了更清晰的说明规则并帮助选手设计和测试程序,命题组开发了一个简单的模拟器。该模拟器根据输入数据和程序输出进行模拟,并给出详细过程和最后的结果。最终的测试将严格按照该脚本的输出进行评判。你可以用它测试样例输入和输出,或者自己设计的其他数据。模拟器将会对各条非法指令给出警告信息(例如非法的移动,无法识别的指令等)。
每小时的模拟过程如下:
第一步:对于每个尚未修复的公司i,将P(i)累加进总损失。
第二步:按照序列从小到大的顺序依次执行各维修队的指令。

模拟器用python编写,没有安装python的选手可以在 http://www.python.org/下载 最新版本

 

评分规则

  1. 程序将运行在一台Linux机器上(内存使用不作严格限制),在每一测试用例上运行不能超过2秒,否则该用例不得分;
  2. 要求程序能按照输入样例的格式读取标准输入数据,按照输出样例的格式将运行结果输出到标准输出上。如果不能正确读入数据和输出数据,该题将不得分;
  3. 本题包含30个测试点,每个测试点10分,共300分。
    测试点1~10满足R, C<=10, n<=5, k<=10, B<=15, T<=30
    测试点11~20满足R, C<=30, n<=10, k<=20, B<=50, T<=500
    测试点21~30满足R, C<=100, n<=100, k<=500, B<=1000, T<=10000
    每个测试点独立评分。对于每个测试点,你的得分不仅取决于你的输出,还取决于其他选手的输出。非法输出的得分为0,合法输出的得分大于0。设合法输出的程序数为M,比程序i的方案严格更优的程序数为Y(i),则该测试点程序i的分值为10(1-Y(i)/M)。换句话说,输出该测试点最优解的程序将获得10分,而最差解惟一的情况,输出最差解(但合法)的选手将得到10/M分。注意:每个测试点的得分不一定为整数。
 

你可能感兴趣的:(2007年百度之星复赛试题)