1.成语纠错(15分)
问题背景
成语是中华民族的文化瑰宝,作为历史的缩影、智慧的结晶、汉语言的精华,闪烁着睿智的光芒。
你的任务是给一个错误的四字成语进行纠错,找到它的正确写法。具体来说,你只允许修改四个汉字中的其中一个,使得修改后的成语在给定的成语列表中出现。原先的错误成语保证不在成语列表中出现。
有时,这样的“纠错”结果并不惟一。例如“一糯千金”可以改为“一字千金”也可以改成“一诺千金”。但由于“糯”和“诺”是同音字,“一糯千金”实为“一诺千金”的可能性比较大。
因此,我们还将提供一个汉字分类表,要求修改前后的两个字必须属于同一个分类。
在这样的限制下,我们保证成语纠错的结果惟一。
注意
1、汉字均采用GBK编码(参见FAQ)
2、每个汉字分类至少包含两个汉字,同一个汉字可能出现在多个类别中。
3、成语列表中的成语都是真实存在的四字成语。成语列表和待纠错成语中的所有汉字均在汉字分类表中的至少一个分类中出现。
输入格式
输入第一行包含两个整数n,m(1<=n<=200,1<=m<=20000)。n表示汉字类别的个数,m表示成语的个数。
以下n行每行用一个无空白分隔符(空格、TAB)的汉字串表示一个分类中的所有汉字。注意,该汉字串最多可能包含200个汉字。
以下m行为成语列表,每行一个成语,恰好四个汉字。
最后一行为待纠错的成语,恰好四个汉字,且不在成语列表中出现。
输出格式
仅一行,为一个四字成语。在“修改必须在同一分类中进行”的限制下,输入数据保证纠错结果惟一。
样例输入
73
糯诺挪喏懦
字自子紫籽
前钱千牵浅
进近今仅紧金斤尽劲
完万
水睡税
山闪衫善扇杉
一诺千金
一字千金
万水千山
一糯千金
样例输出
一诺千金
2.圆内五角星(20分)
问题背景
如图,一个半径为1的圆周上有5个点。按角度制给出5个点的极角Ai(0<=Ai<360,i=1..5)。按下图的方法连成一个五角星,计算圆被切割成的11个部分面积的方差。
具体地说,假定11个区域的面积分别为S1,S2,…,S11,那么面积的均值计算方法为:
M=(S1+S2+…+S11)/11
面积的方差计算方法为:
D=((S1-M)2+(S2-M)2+…+(S11-M)2)/11
输入格式
输入仅一行,包含5个[0,359]内的互不相等的整数。
输出格式
输出仅一行,包含一个实数,即各部分面积的方差。输出保留小数点后4位。
样例输入
014472288216
样例0.0647
3.传输方案规划(30分)
问题背景
面对艰巨复杂的技术挑战,百度所崇尚的系统设计哲学是“简单可依赖”,而百度的工程师们正在互联网世界中实践着这种理念。这里正好有一个挑战,让作为百度之星的你小试牛刀:
在处理数以百亿计的网络信息的过程中,有一个很常见的问题:怎么样将一个集群上的信息以最低的成本传输到另外一个集群上?
• 数据源集群A有n台服务器,编号为1,2,…,n,i号服务器上待传输的数据量为Ai,单位是GB。
• 目的地集群B有m台服务器,编号为1,2,…,m,j号服务器上的空闲容量为Bj,单位为GB。
• A集群的i号服务器上的每GB数据对于B的集群的j号服务器收益为Vi,j,从A集群的i号服务器向B集群的j号服务器传输1GB数据的开销为Ci,j。
你的任务是在保证A中的所有数据传输完毕的前提下,性价比V/C尽量高。其中V为所有数据在B集群上的价值之和,C为总开销。换句话说,若A集群的i号服务器向B集群的j号服务器发送了Ti,j个GB的数据,则性价比定义为:
输入格式
第1行两个整数n,m(1<=n,m<=50),即集群A和B各自的服务器台数。
第2行包含n个不超过100的正整数A1,A2,…,An,即集群A中每台服务器的待传输数据量(单位:GB)。
第3行包含m个不超过100的正整数B1,B2,…,Bm,即集群B中每台服务器所能接受的最大数据量(单位:GB)。
第4~n+3行每行包含m个不超过100的非负整数Vi,j,表示集群A的i号服务器中每GB数据对于集群B中的j号服务器的价值。
第n+4~2n+3行每行包含m个不超过100的正整数Ci,j,表示集群A的i号服务器中每GB数据传输到集群B中的j号服务器所需要的开销。
输出格式
仅一行,为最大性价比。输出保留三位小数(四舍五入)。如果A的数据无法传输完毕,输出-1。
样例输入
22
12
21
110
75
61
32
样例输出
2.091
样例解释
一个方案是:
集群A的1号服务器把所有数据传输到集群B的1号服务器,价值11,开销6。
集群A的2号服务器把1GB数据传输到集群B的1号服务器,价值7,开销3,然后把剩下的1GB数据传输到集群B的2号服务器,价值5,开销2。
性价比:(11+7+5)/(6+3+2)=2.091
另一个方案是:
集群A的1号服务器把所有数据传输到集群B的2号服务器,价值0,开销1。
集群A的2号服务器把所有数据传输到集群B的1号服务器,价值14,开销6。
性价比:(0+14)/(1+6)=2。
第一种方案更优。
4.公平数(35分)
问题背景
如果一个整数的十六进制表示(不含前导0)中,前一半数字之和等于后一半数字之和,我们称它为公平数。
注意,如果该数的十六进制表示中包含奇数个数字,则正中间的数字既不属于前一半,又不属于后一半。
例如在十六进制下1+D=7+7,因此1DE77是公平数。数字E并不参与计算。
再例如,所有单个数字的十六进制数(即0~F)均为公平数,但F0不是(不能把F0补充前导0写成0F0,进而认为它是公平数)。
给出十六进制数X,Y,K和十六进制数字集合S,求区间[X,Y]之内,有多少个公平数满足:
• 十六进制表达式(不包含前导0)中每个数字均在集合S中
• 并且为K的倍数
输入格式
输入第一行为数字集S,包含0~9以及大写字母A~F。
每个数字或字母最多出现一次。
第二行包含3个十六进制正整数K,X,Y,均不超过10个数字。
输出格式
仅一行,包含一个整数,即满足条件的公平数个数。
样例输入
124C
5100FFF
样例输出
4
样例解释
只有四个数满足条件:212,424,4C4,C1C。
----------------------------------------------------------------------
1. 火柴游戏(250分)
题目描述
在百度,同事们之间喜欢交流游戏。其中,火柴游戏是一个比较经典的例子。游戏的规则很简单:恰好移动一根火柴,使等式成立。如下面的等式可以变成3+6=9(还有其他解):移动哪一根火柴能使等式成立?
下面是所有火柴数字的样子
请你写一个程序,找出所有的规范解。所谓规范是指:
* 只能改变数字,不能改变符号;
* 数字和符号的组成方式必须严格的和图示的一样(减号由一根火柴组成);
* 新等式必须形如a+b=c或a-b=c,其中a、b、c都是不含前导0的非负整数。
当然,最重要的是:新的等式必须在数学上成立。
输入格式
输入仅一行,为一个格式为a+b=c或a-b=c的表达式,其中a、b、c均为不含前导0的非负整数。表达式长度不超过100,且不含空白字符。因此,加号/减号紧跟在a的后面、 b紧跟在加号/减号的后面、等号紧跟在b的后面、c紧跟在等号的后面。
输出格式
输出所有规范解,按字典序输出(请注意:输出顺序不对将不得分)。无解时,仅输出一行-1。
样例输入1
9+5=9
样例输出1
3+5=8
3+6=9
样例输入2
1+1=2
样例输出2
-1
测试数据
共10个测试点,基本参数如下表:
测试点编号 | 表达式的长度 |
1-2 | 1-10 |
3-4 | 10-25 |
5-6 | 26-50 |
7-10 | 51-100 |
裁判问答:
Q:第一题的表达式长度不是只有5吗? A:可以多位整数
Q:把某根移出来再移到原来的位置上算不算移动? A:不算
2. 电子商务平台商品推荐问题 (300分)
题目描述
百度网络交易平台(“百度有啊 ”) 是建立在百度旗下独有的搜索技术、强大社区资源基础上的中文互联网领域最具规模的网上个人C2C交易平台。伴随着“百度有啊”的成长,“有啊”的顾客也蜂 拥而至;面对如此大量的用户,如何把平台上数以千万计的商品按一定的规则推荐给他们以促成交易,是“百度有啊”面临的重要问题。
在本题中,假设有M个用户和N种产品,每个用户的浏览历史可以用一个N维特征向量 X描述:Xi=1当且仅当该用户曾经浏览过商品i。如果用户A和用户B曾浏览过(部分)相同的商品,我们说用户A和用户B相似;如果用户A和用户B相似, 或者用户A和一个“与用户B相似”的用户相似,则需要把用户A和用户B划分到同一个用户群。该用户群中所有用户的特征向量的“按位或” 便是整个用户群的特征向量——它表示至少被其中一个用户浏览过的商品集合。
每当一个新用户到来时,可以计算出它和所有用户群之间的相似度。假定他的特征向量为A,用户群的特征向量为B,则:
其中计算特征向量模长时使用的是二范数,即所有维度数值的平方和的算术平方根。
接下来,我们应找出该用户最接近的用户群,并从该用户群购买过的商品中选三个商品进行推荐。一般来说,一个商品被购买的次数越多,就越应该被优先推 荐(若购买次数相同,优先推荐id值小的商品),但为了避免马太效应,我们需要做一个特殊处理:不推荐最畅销的商品(如果有多个商品的购买次数都是最多 的,则它们都不应该被推荐, 为简单计, 如果所有商品的购买次数都一样的话就都不推荐了)。另外,推荐给用户的商品不能是他已经购买过的商品。
如果从最接近的用户群中无法推荐出三个商品,应从次接近的用户群购买的商品中以相同的规则补充,以此类推,直到选出三个推荐商品,或者无法选出更多商品。
测试数据保证任何一个用户不会跟两个不同用户群的相似度相同,因此商品推荐的结果总是惟一的。
注意:如果用户浏览记录跟某用户群的相似度为0,则在任何情况下都不从该用户群购买的商品中推荐。
输入格式
第1行:M、N,分别是平台用户数和商品总数。0 < M,N <= 100 000
第2行:K,表示接下来有K行记录。0 < K <= 100 000
第3~K+2行,每一行是一次用户的浏览-购买记录,记录格式为:
uid i1,i2, …,ip b1,b2,…,bq
其中uid是不超过M-1的非负整数,代表用户id。i为本次浏览的商品id集合(无重复元素,元素顺序无意义),而b为该用户在此次浏览后购买的 商品集合(无重复元素,元素顺序无意义)。i中的每个元素均为不超过N-1的整数,b是i的子集。q <= p <= 50。注意:同一个用户ID可以对应多条记录
第K+3行:Q,表示接下来有Q次查询。0 < Q <= 125
第K+4~K+Q+3行:每一行是一次用户的浏览记录,格式为
uid i1,i2, …,ip
含义类似于浏览-购买记录。注意:用户群划分方式完全取决于第3行开始的K条记录。这里的查询不会导致用户群划分方式的变化(在实际的系统中,用户群数据也是定期更新,而非实时修改)。
输出格式
对每个查询输出一行,为推荐的最多三个商品的id(为不超过N-1的非负整数),按推荐度降序排列。如果没有任何可推荐的商品,输出NONE;如果有商品可推荐,但不足三个,应全部输出。
样例输入
9 12
8
0 0,1,2 1
1 3,4,5 3,4
2 1,5 1
3 6,7 6,7
4 8,9 8
5 8,10 8,10
0 11 11
8 6 6
3
6 0,1,2
1 0,1,2,6
3 8,9
样例输出
3 4 11
11 7
10
PS:原样例有错,于22:45分修正样例
样例解释
首先对购买历史进行预处理形成用户群,然后对每个用户群购买的商品按购买次数进行排序,结果如下:
用户群ID | 用户ID | 浏览过的商品ID集合 | 购买的商品ID |
0 | 0,1,2 | 0,1,2,3,4,5,11 | 1(2次),3,4,11 |
1 | 3,8 | 6,7 | 6(2次),7 |
2 | 4,5 | 8,9,10 | 8(2次),10 |
接下来处理查询。
输入:0,1,2 输出:3,4,11
此浏览记录与用户群0最接近。根据规则推荐3,4,11 (1是最畅销商品,不推荐;对于被购买数量相同的商品3和4,优先推荐id值小的商品)
输入:0,1,2,6 输出:7,11
此浏览记录与用户群1最接近,根据规则推荐7(6是最畅销商品,不推荐);由于不足三个商品,从次接近的用户群0中推荐,推荐11 (1是最畅销商品,3、4是购买过的商品);仍然不足三个商品,但是已无更多商品可以推荐。
输入:8,9 输出:10
此浏览记录与用户群2最接近,根据规则推荐10;不足三个商品,但是已无更多商品可推荐。
测试数据
共20个测试点,基本参数如下表:
测试点编号 | M | N | K | Q |
1 | <=100 | <=100 | <=100 | <=100 |
2 | <=100 | <=100 | <=100 | <=100 |
3 | <=100 | <=100 | <=100 | <=100 |
4 | <=100 | <=100 | <=100 | <=100 |
5 | <=100 | <=100 | <=100 | <=100 |
6 | <=1000 | <=1000 | <=1000 | <=100 |
7 | <=1000 | <=1000 | <=1000 | <=100 |
8 | <=1000 | <=1000 | <=1000 | <=100 |
9 | <=1000 | <=1000 | <=1000 | <=100 |
10 | <=1000 | <=1000 | <=1000 | <=100 |
11 | 10000 | 10000 | 10000 | 100 |
12 | 20000 | 20000 | 20000 | 100 |
13 | 30000 | 30000 | 30000 | 100 |
14 | 40000 | 40000 | 40000 | 100 |
15 | 50000 | 50000 | 50000 | 100 |
16 | 60000 | 60000 | 60000 | 100 |
17 | 70000 | 70000 | 70000 | 100 |
18 | 80000 | 80000 | 80000 | 100 |
19 | 90000 | 90000 | 90000 | 100 |
20 | 100000 | 100000 | 100000 | 100 |
3. 争车位(300分)
题目描述
争车位是目前SNS网站上比较热门的游戏之一。假如小明有N个好友和M辆车。每个好友都有K个车位。这些车位可能停放了小明的车,也可能停放了其它人的车,还能没有停任何车辆(空车位)。在当前状态中,小明的M辆车全停放在他的好友的车位上。
任务一:考虑如下的移车规则:
1. 必须按一定顺序依次移动自己的车,而不能移动别人的车。
2. 每辆车只可以移动一次。
3. 车只能从原来的位置移到空车位处,不能移动到一个已停放了车的车位(无论这辆车是谁的)。移动后,原来的位置就成了空车位。
4. 只能跨好友移车。也就是说,一辆车不能从某好友的车位移到这个好友的另一车位。
请帮助小明把他的所有M辆车都移动一遍。
任务二:考虑如下的移车规则:
1. 每个车位都对应一个金额。当小明把一辆车最终停在某个车位时,将会得到该车位对应的金额。
2. 不一定需要把所有车都移一遍,但只有移动前后处于不同车位的车才能得到对应的金额。
3. 可以把自己的车开到附近的空地上(那里足以停下他所有的车)作为临时中转。因此车不必依次移动,每辆车也可以多次移动。但请注意:所有移动结束之后,每个车位最多只能停一辆车。
4. 和任务一相同的是:仍不许动其他人的车,且每辆车在移动之前和所有移动结束后所在的车位仍必须属于不同好友。特别地,不许最终把一辆车停到用于中转的那个空地上。
请帮助小明获得最大的总金额。
输入格式
第1行包含一个整数T,即任务编号(T=1或2)。
第2行包含两个整数N、K,分别表示小明的好友数和每个好友的车位数。以下N行每行有一个包含K个字符的字符串,描述每个好友当前车位的状态。其中‘#’ 表示该车位停放的是小明的车;‘*’ 表示该车位停放的是其它人的车; ‘.’ 表示该车位是空车位。
如果T=1,输入到此结束;否则接下来的N行每行包含K个不超过100的整数,分别表示每个车位对应的金额。
输入据至少有一辆小明的车。
输出格式
如果T=1,输出任意可行的移车方案。假如有M个步骤,则第一行输出M,紧接着M行表示M步的具体内容。格式为:(x1,y1)->(x2,y2),表示把第x1个好友第y1个车位上的车移到第x2个好友的第y2个车位。如果无解,输出-1。
输入T=2,输出一个数字,表示最多的金额总数。
样例输入1
1
3 4
##*.
.#**
****
样例输出1
3
(0,0)->(1,0)
(1,1)->(0,3)
(0,1)->(1,1)
样例输入2
1
3 4
##*#
.#**
****
样例输出2
-1
样例输入3
2
2 2
#*
#*
2 1
1 2
样例输出3
3
测试数据
共20个测试点,基本参数如下表:
测试点编号 | T | N | K |
1 | 1 | 3 | 6 |
2 | 1 | 10 | 10 |
3 | 1 | 10 | 10 |
4 | 1 | 3 | 4 |
5 | 1 | 100 | 100 |
6 | 1 | 10 | 100 |
7 | 1 | 10 | 100 |
8 | 1 | 10000 | 100 |
9 | 1 | 100000 | 100 |
10 | 1 | 100000 | 100 |
11 | 2 | 2 | 4 |
12 | 2 | 10 | 4 |
13 | 2 | 5 | 5 |
14 | 2 | 3 | 4 |
15 | 2 | 20 | 4 |
16 | 2 | 50 | 10 |
17 | 2 | 50 | 10 |
18 | 2 | 10 | 10 |
19 | 2 | 50 | 10 |
20 | 2 | 50 | 10 |
题目描述
蝎子精和蛇精为祸人间,葫芦七兄弟准备与之决一死战。不幸的是,七弟不慎被两只妖精抓住,困 在了蛇蝎山的囚笼里,其余六兄弟必须尽快去营救。二娃使用千里眼,查看到七弟被囚的位置,但蛇蝎山地势复杂,机关遍布,如何才能又快又安全的把七弟救出来 呢?于是,六兄弟请您来帮忙了。
在二娃的帮助下,大家先绘制了一张蛇蝎山的地图,并把能安全停留的地方以点标记。你很快就发现,这些安全点组成了一个六邻接图——每个点都与左上、 左、左下、右下、右、右上六个点等距。于是,你以其中两条坐标轴:“左——右”和“左上——右下”,给各点设置坐标(见图1)。只要把囚笼的六个邻接点都 占了,然后六兄弟一起施法,就能把七弟营救出来。
图1. 六邻接图及坐标
虽然已经有了地图,但怎样走才能最快的把七弟救出来呢?葫芦兄弟告诉你,他们有两种移动方式:
1、跑步。可在一单位时间移动一单位距离,即从一个点移动到某个邻接点(见图2)。
图2. 跑步移动示意图
2、翻跟头。可在一单位时间沿着一个坐标轴方向移动多个单位距离,但其飞过的每个点上都必须有葫芦兄弟站在那里施法。例如,在点 (0,0)和点(1,1)都有葫芦娃,那么位于点(2,2)的葫芦娃便可在兄弟的帮助下,沿着“左下——右上”坐标轴直接翻跟头到点(-1,-1)(见图 3)。
图3. 翻跟斗移动示意图
另外,为了不引起妖精的注意,每一单位时间最多只有一个葫芦娃能移动,且每个点上只能站一个葫芦娃。由于葫芦兄弟心灵相通,被囚的七弟也能为兄弟施法。
六个葫芦娃的出发位置为(0,0),(1,0),(2,0),(1,1),(2,1),(2,2)。如果按照最快的方案,六兄弟需要多长时间才能救出七弟呢?
输入格式
输入仅包含一行,包含两个整数X, Y,表示囚禁七弟的位置。只要把此点的六个邻接点都占了,就能把七弟救出来。 (X,Y)不会和上述六个出发点重合。0 <= X, Y < 7
输出格式
输出一行,包含一个整数,即营救的最短时间。
样例输入1
3 1
样例输出1
4
样例输入2
3 4
样例输出2
8
样例输入3
0 5
样例输出3
14
测试数据
共30组数据,输出结果近似在[0,16]内均匀分布。
注意事项
•请不要把离线计算的结果保存在源代码中(例如,直接把答案保存在ans[X][Y]中,读取输入后直接输出),否则本题得0分.
•请不要特判/猜测/随机打印结果,否则本题得0分。
•今年新增比赛规则: 公布所有选手的源代码。关于运行时限: 每题均有两个时限T1/T2。如果程序输出正确,且程序运行时间为T,则T<=T1时,该测试点得分为100%, T>=T2时,该测试点得分为0%。T1<T<T2时,该测试点得分为(T2-T)/(T2-T1) * 100%。 T1根据参考程序的运行速度和题目难度设定,T2通常取T1的4倍到8倍之间。 具体的T1,T2不公布。