百度之星程序设计大赛
前言 转自:http://blog.chinaunix.net/space.php?uid=26931819&do=blog&id=3228922
“百度之星的程序设计大赛”举行的如火如荼,有很多人都报名参加了。特此小编写这篇博客来共同探讨探讨。
一、百度计算器的加法
1.1 “百度计算器的加法”题目描述
百度框计算中提供了计算器这个功能,模拟计算器中的复杂功能,我们最先需要解决的就是实现加法模块。今天就给你个机会,和百度计算器一样,计算一下十以内的加法吧。
输入
仅有一组数据,包含两个正整数,分别为a, b(0 <= a, b <= 10)
输出
一个正整数,暨输入a, b后对应的a+b的计算结果
1.2 分析
题目很简单,就是简单的输入输出计算。不愧为热身题啊。
只是需要注意的是输入输出不要有太多多余的问题则可
二、小诺爱USB设备
2.1“小诺爱USB设备”描述
在百度工作的小诺是一个USB设备迷,在他桌上有一堆的USB设备——USB鼠标、USB小音箱、USB按摩器……但是,公司配给小诺的ThinkPad X系列的电脑只有一个能用的USB接口。不过还好,小诺有一堆的USB Hub,可以把一个可用的USB接口变成多个USB接口。但是,小诺很难确定这些USB Hub能否满足他他众多的USB设备的需求。
输入
输入首行包括一个整数N(1 ≤ N ≤ 20),表示测试数据组数。接下去的N行,每行包括一组测试数据。每组测试数据行以一个整数K开头(1 ≤ K ≤ 10),表示这组测试数据提供的USB Hub的数量;紧接着,在同一行,有K个整数(每两个整数之间由一个空格分隔开),{M1,M2…Mi…MK}(2 ≤ Mi ≤ 10),每个整数表示了这个USB Hub能将一个USB接口数变成的多个USB接口的数量。
输出
针对每组测试数据输出一个结果,表示小诺用这组提供的USB Hub后,能最多使用的USB设备的数量。每个输出占一行。
样例输入
3
2 2 2
3 3 2 4
6 2 2 2 3 4 5
样例输出
3
7
13
2.2 分析
这道题目主要看对题意的理解,其过程就是一个又一个的USB Hub把原来的接口不断地扩展。如果一个USB Hub有n个接口,那么他就可以增加n-1个接口。那么如果有m个这样的USB Hub,且每一个USB Hub相应的有x1,x2,……,xm扩展口,最终的能把原来只有一个的接口扩展成(x1+x2+……+xm-m+1)个接口(+1的原因是原来本身有一个接口)。那么问题就转化成一个累加的过程了
三、易手机套餐
3.1 “易手机套餐”问题描述
装载百度易平台的易手机已经上市,为了更好的为大家提供服务。百度与合作的运营商正在讨论为易手机用户推出一款特别的套餐,帮助大家更好的利用易手机。作为这个项目负责人的晓萌调研了大量用户使用这个套餐后会出现的资费预估,让我们来看看这个特别的套餐到底会带来怎样资费情况吧。
输入
输入数据包括十二行,每行包括一个数字(不含金钱符号$),表示晓萌调研的某一用户使用特别套餐后,一月到十二月消费的资费情况。每行包括的这个数字精确到小数点后两位。
输出
输出仅一行,表示用户使用该套餐后,针对给出的12个月的资费的均值情况。在分位采用四舍五入进位。输出以金钱符号$开头,输出中不含空格等其它特别字符。
样例输入
112.00
249.12
214.12
34.10
223.05
109.20
53.27
102.25
239.18
95.99
95.01
25.75
样例输出
$129.42
3.2 分析
题目中描述的很明确,我们所要做的就是输入12个数据,然后求取平均数。
如果都是这种题目的话,小编,还有广大读者都会很开心滴!
当然,这道题目的准确率也不少100%,需要注意的就是“$“符号,还有输出是小数点后两位这个条件的控制,即加入”.2“这个条件。
四、共同狂欢
4.1 “共同狂欢“题目描述
百度2005年8月5日上市时,在北京和纳斯达克的同学们每一个小时整点时就会通一次电话,对一下表,确认一切相关活动都精确同步。但是要注意,在两边的同学位于不同的时区,在夏时制时,两地时差12小时,因此,每次对表都需要做一下时区转换。你来帮我们完成这个有点麻烦的工作吧。
输入
输入的第一行包括一个整数T(T ≤ 30),表示测试数据的组数;接下去的T行每行包括一个时间,表示两地中的一个地方同学报出的整点的时间,表示成“H:M”的形式,其中H是小时(0 ≤ H < 24,且当H小于10的时候可以表示成1位或者2位的形式)、M是分钟(0 ≤ M < 60,且当M小于10的时候可以表示成1位或者2位)。
输出
每个测试数据输出一行,当是整点对时时,输出时区转换后的小时结果;当不是整点对时时,输出0。
样例输入
4
12:00
01:01
3:00
00:00
样例输出
24
0
15
12
4.2 分析
本题首先需要判断的是“分“是否为0,如果不为0,则直接输出0;否则对”时 “进行判断,如果小于12,则把”时“加12;否则,就减12。
五、C++ 与Java
5.1 “C++ 与Java“的问题描述
在百度之星的贴吧里面,Java的爱好者和C++的爱好者总是能为这两种语言哪个更好争论上几个小时。Java的爱好者会说他们的程序更加整洁且不易出错。C++的爱好者则会嘲笑Java程序很慢而且代码很长。
另一个Java和C++爱好者不能达成一致的争论点就是命名问题。在Java中一个多个单词构成的变量名应该按照如下格式命名:第一个单词的开头用小写字母,其余单词都以大写字母开头,单词与单词之间不加分隔符,除单词的首字母之外的字母一律使用小写。例如:javaIdentifier, longAndMnemonicIdentifier, name, bAIDU.
与Java不同C++的命名全都使用小写字母,在单词和单词之间使用“_”来作为分隔符。例如:c_identifier, long_and_mnemonic_identifier, name (当名字中只有一个单词的时候,Java与C++的命名是相同的), b_a_i_d_u.
你的任务就是写一个程序能让C++和Java程序相互转化。当然转换完成的程序中的变量名也要符合其语言的命名规则,否则的话是不会有人喜欢你的转换器的。
首先你要做的就是写一个变量名转换器。给出一个变量名,你要先检测是Java的还是C++的,然后把它转化为另一种命名格式。如果两种都不是,那么你的程序就要报错。转换过程必须保持原有的单词顺序,只能改变字母的大小写和增加或删除下划线。
输入
输入有且仅有一行,是一个变量名,其中包含字母和下划线,长度不超过100。
输出
如果输入的是Java变量名那么输出它对应的C++形式。如果是C++的则输出对应的Java的形式。如果两种都不是就输出“Error!”。
样例输入
输入样例1:
long_and_mnemonic_identifier
输入样例2:
anotherExample
输入样例3:
i
输入样例4:
bad_Style
样例输出
输出样例1:
longAndMnemonicIdentifier
输出样例2:
another_example
输出样例3:
i
输出样例4:
Error!
5.2 分析
该题目的题干很长,需要耐心阅读,找出本质。
C++变量名的特点有:字符”_”后面一定跟有字母,且是小写字母。
Jave变量名的特点有:存在大写字母,且不是第一个字符
根据以上的两种语言的特点,需要注意一下几种情况
a. 一个字符串既有“_“又有大写字母,应该输出”Error!“
b. 一个字符串是以“_“作为结尾的,应该输出”Error!“
c. 一个字符串开口时大写字母的,应该输出”Error!“
然后根据上面的分析,可以顺利的写书相应的程序
六、百科蝌蚪团
6.1 “百科蝌蚪团”问题描述
百度百科有一支神奇的队伍,他们叫自己“百科蝌蚪团”。为了更好的让蝌蚪团的成员们安排工作,百度百科的运营团队定出了一个24小时制的时间表。例如:
1. 每个蝌蚪团成员工作时长相同;
2. 必须安排蝌蚪团成员在他们方便的时间段工作;
3. 蝌蚪团成员安排时间最小安排时间节点(开始工作或停止工作)为半小时,比如04:00或04:30,而不是04:15;
4. 蝌蚪团成员一天在百度百科工作的时间是有上限的,他们会根据自己的情况给出上限。
5. 在特定时间段内必须有一定数量的蝌蚪团成员工作,以保证百度百科不断的进步
请帮运营团队计算一下,能保持24小时稳定在岗的蝌蚪团最少成员的数量。如果有2个蝌蚪团成员工作结束,同时另2个蝌蚪团成员开始工作,这段时间都算有2各成员稳定在岗。
输入
输入有多组,每组测试数据以一个整数N开头(1 ≤ N ≤ 50),表示蝌蚪团的成员数。紧接着,我们会有N个数据块,每一个数据块对应了一名蝌蚪团成员的日程情况。
每个数据块以两个整数开始,分别为K(1 ≤ K ≤ 50)和M(1 ≤ M ≤ 1440),用空格隔开。K表示这个数据块对应蝌蚪团成员方便的时间段的数量,M表示这个成员愿意每天在百度百科工作的最长分钟数。接下去的K行中,每行包括两个时间,分别表示成“HH:MM”的格式,以空格分隔,分别对应了该蝌蚪团成员一个方便的时间段的开始时间、结束时间;例如09:00 10:00表明他在早上九点到十点的时间段是方便的,可以在百度百科工作。如果两个时间相同,则说明这个他全天都是方便的。
最后一组数据的N为0,表示输入结束。
输出
对于每组数据,输出为一个整数,占一行。表示能保持24小时稳定在岗的蝌蚪团最少成员的数量。
样例输入
5
1 720
18:00 12:00
1 1080
00:00 23:00
1 1080
00:00 20:00
1 1050
06:00 00:00
1 360
18:00 00:00
3
1 540
00:00 00:00
3 480
08:00 10:00
09:00 12:00
13:00 19:00
1 420
17:00 00:00
3
1 1440
00:00 00:00
1 720
00:00 12:15
1 720
12:05 00:15
0
样例输出
2
1
1
6.2 分析
首先可以确定每个成员的工作时间,即,T=M/N。接着,从一开始,往后半个小时半个小时安排工作,满足每个时间都有工作成员在,且不要重叠时间。一层排满后,再循环往上安排时间,原则同样是不能重叠时间。如此循环,一直到一个时间没有人可以顶替了。这是后统计前面有几层,这里的层数就是我们所要答案
七、聊天就是Repeat
7.1 “聊天就是Repeat“问题描述
百度Hi作为百度旗下的即时聊天工具,在百度公司内部很是流行。要实现这样的一个聊天工具,最重要的问题就是要能保证我发出的内容能原封不动的在接收同学那里显示出来。今天,就给你一个机会,让你模拟一下百度Hi传递信息的过程,把我发给Robin的聊天内容原封不动的输出出来。
输入
输入的聊天内容数据有多组,每组数据占一行。
输出
与输入聊天内容完全相同的内容。请注意每组数据中的空格也要原封不动的被传过去噢~
7.2 分析
所有的要求显而易见,此题是简单地字符串输入输出问题。
八、用户请求中品牌
8.1 “用户请求中的品牌“问题描述
馅饼同学是一个在百度工作,做用户请求(query)分析的同学,他在用户请求中经常会遇到一些很奇葩的词汇。在比方说“johnsonjohnson”、“duckduck”,这些词汇虽然看起来是一些词汇的单纯重复,但是往往都是一些特殊品牌的词汇,不能被拆分开。为了侦测出这种词的存在,你今天需要完成我给出的这个任务——“找出用户请求中循环节最多的子串”。
输入
输入数据包括多组,每组为一个全部由小写字母组成的不含空格的用户请求(字符串),占一行。用户请求的长度不大于100,000。
最后一行输入为#,作为结束的标志。
输出
对于每组输入,先输出这个组的编号(第n组就是输出“Case n:”);然后输出这组用户请求中循环节最多的子串。如果一个用户请求中有两个循环节数相同的子串,请选择那个字典序最小的。
样例输入
ilovejohnsonjohnsonverymuch
duckduckgo
aaabbbcccisagoodcompany
#
样例输出
Case 1: johnsonjohnson
Case 2: duckduck
Case 3: aaa
8.2 分析
题意很明确,就是找出最大循环单元。
主要思想就是利用计算机多重嵌套循环的特点。
第一层循环:为了确定循环单元的首字符
第二层循环:为了确定循环单元第二次循环(开始循环)的首字符
第三层循环:为了历遍第二次循环单元的各个字符
同时在第三层循环时,判断是否满足循所确定的循环单元和第二个循环体是否一样,如果是,则说明所确定的循环单元是真的循环体,并收录之。就这样,正在第一层循环的作用下找出所有的真的循环体,然后在这些循环体中取出一个最大的。
九、地图省钱计划
9.1“地图省钱计划“问题描述
百度地图有自己的一套坐标系(你可以把它看作一个笛卡尔坐标系),在这套坐标系里,一个标准单位为1km。而在这坐标系上针对地理信息进行标注的数据,大多数时候是通过购买的方式完成的。为了节约数据更新的成本,数据组里的鑫哥想出了一个好主意——自己测数据。
鑫哥按照他的预想开始实验;在每组试验中,鑫哥选取了三个已经被准确标注在百度地图的坐标系里的移动运营商的基站作为信号接收点(这里可以准确的得到信号的接收时间信息)。当信号接收点附近的用户手机签到时,三个信号接收点就会先后接收到这个信号,并可以准确的知晓接收到信号的时间(将第一个信号点接收到信号的时间记为0秒时刻)。由此,我们就可以确定用户手机签到的位置的在地图的准确坐标了。
现在已知以下数据:
1.三个信号接收点在百度地图坐标系中的具体坐标(x1,y1), (x2,y2), (x3,y3);
2.三个信号点得到用户发出的信号的时间t1, t2, t3(t1, t2, t3 ≥ 0),单位s; t1, t2, t3至少有一个数为0;
3.信号的转播速度C,单位m/s;
请帮助鑫哥写个程序,计算下用户发出信号的位置在百度地图坐标系内的坐标(这个点是唯一的)。
输入
输入包含多组数据,每组数据格式如下:
C
x1 y1 x2 y2 x3 y3
t1 t2 t3
最后一组数据为0,表示输入结束。
输出
针对每组测试数据,请先输出这个组的编号(第n组就是输出“Case n:”);然后换行输出信号发出点的坐标(x,y) 。x,y应该由空格分隔,并被舍入到小数点后第六位。
样例输入
1000
0 1 1 1 2 1
0 0.6 1.6
1000
0 0 0 1 1 0
0.4142135 0 0
1000
0 0 1 0 2 1
0 0.414213562373 1
1000
0 0 0 -1 0 1
0 0 1
1000
0 0 0 1 0 -1
0 1 0
1000
0 0 1 0 -1 0
0 1 0
1000
0 0 -1 0 1 0
0 0 1
100
0 0 0 1 1 0
0 10 10
0
样例输出
Case 1:
0.200000 1.000000
Case 2:
1.000000 1.000000
Case 3:
0.000000 1.000000
Case 4:
0.000000 -0.500000
Case 5:
0.000000 -0.500000
Case 6:
-0.500000 0.000000
Case 7:
-0.500000 0.000000
Case 8:
0.000000 0.000000
9.2 分析
这个题目与其说是计算机题目,还不如说高中数学题。
根据已知条件可以设以下变量:
(x0,y0) -要测的地址的坐标
t0 -要测的地址到最近站点的时间
(x1,y1), (x2,y2), (x3,y3) -三个信号接收点所在坐标
t1, t2, t3 -三个信号点得到用户发出的信号的时间
C -信号的转播速度
那么可以根据数学关系得到以下式子
三个方程-三个未知数(x0,y0,t0)可以直接解出(x0,y0)的值。(当然你可以手算,也可以用matlab中的sovle、sym的函数)。
然后一旦有(x0,y0)的表达式,就可以可以直接输出了。
十、百度的新大厦
10.1 “百度的新大厦”问题描述
继百度搜索框大厦之后,百度又于2012年初在深圳奠基了新的百度国际大厦,作为未来百度国际化的桥头堡。不同于百度在北京的搜索框大厦,新的百度国际大厦是一栋高楼,有非常多的楼层,让每个楼中的电梯都能到达所有楼层将是一个极为不明智的设计。因此,设计师给出了一个特别的设计——一共大厦有m个电梯,每个电梯只有两个按钮,(针对第i个电梯)两个按钮分别可以使电梯向上或ui层向下一定di层;百度国际大厦很高,你永远到不了顶层,也就是说电梯没有上限,但是,电梯不可以钻入地下,也就是说是有下限的。我们将每层楼用整数标记,为了体现IT公司的特质,我们以0作为地面这一层的标记。
如果你某天在百度国际大厦的0层,仅可以选择m个电梯中的一个乘坐(不可以中途换电梯),请你计算,你按电梯中的按钮n次后(每次两个按钮选一个按),可以到达的最低楼层数。
输入
输入的第一行包括两个整数,分别为n和m(1 ≤ n ≤ 1,000,000,1 ≤ m ≤ 2,000),表示按电梯按钮的次数和大厦中的电梯数量。接下去的m行,每行包括2个由空格分割的数字,分别表示了提供的m个电梯中的某一个的上行按钮上升一次的层数ui和下行按钮下降一次的层数di(1 ≤ ui,di ≤ 1000)
输出
输出一个正整数,表示选用m个电梯中的一个后,在电梯里按电梯中的按钮n次后(每次两个按钮选一个按),可以到达的最低楼层数。
样例输入
10 3
15 4
15 12
7 12
样例输出
13
提示
按钮上的移动楼层数无法改变,比方说从8层向下9层是不可行的
10.2 分析
这道题最重要的是理解题意。我们可以把“按n次电梯按钮”的过程分解为“向上按j次”和“向下按n-j次”。如果设向上按一次可以上u层,向下按一次可以下d 层。那么只要j*u-(n-j)*d大于0,且循环查找j使得该值最小,这个值就是这个楼梯的最小楼层数。那么,m个电梯就有m个最小值,其中最小的一个值就是题目的解。
根据以上的思想就可以很简单的把题目编出来了。
附录
给出部分题目的程序
1.百度计算器的加法
点击(此处)折叠或打开
- #include<stdio.h>
-
- int main()
- {
- int a,b;
- scanf("%d%d",&a,&b);
- printf("%d\n",a+b);
- return 1;
- }
2.小诺爱USB设备
点击(此处)折叠或打开
- #include<stdio.h>
-
- int main()
- {
- int N,i,j,tt,num,an[20];
- scanf("%d",&N);
- for(i=0;i<N;i++)
- {
- an[i]=0;
- scanf("%d",&num);
- for(j=0;j<num;j++)
- {
- scanf("%d",&tt);
- an[i]+=tt;
- }
- an[i]=an[i]-num+1;
- }
- for(i=0;i<N;i++)
- {
- printf("%d\n",an[i]);
- }
- return 1;
- }
3.易手机套餐
点击(此处)折叠或打开
- #include<stdio.h>
-
- int main()
- {
- int i;
- float sum=0,an[12];
- for(i=0;i<12;i++)
- {
- scanf("%f",&an[i]);
- sum+=an[i];
- }
- printf("$%.2f\n",sum/12);
- return 1;
- }
4.共同狂欢
点击(此处)折叠或打开
- #include<stdio.h>
-
- int main()
- {
- int T,i;
- int H[30],M[30];
- scanf("%d",&T);
- for(i=0;i<T;i++)
- {
- scanf("%d:%d",&H[i],&M[i]);
- }
- for(i=0;i<T;i++)
- {
- if(M[i]!=0)
- {
- printf("0\n");
- }
- else
- {
- if(H[i]>12)
- {
- printf("%d\n",H[i]-12);
- }
- else
- {
- printf("%d\n",H[i]+12);
- }
- }
- }
- return 1;
- }
5.C++与Java
点击(此处)折叠或打开
- #include<stdio.h>
- #include<string.h>
-
- int main()
- {
- int ex='A'-'a';
- int i,j,kk=0,mm=-1;
- char str[301];
- char strN[601];
- scanf("%s",str);
- for(i=0,j=0;i<strlen(str);i++)
- {
- if(i==0&&!(str[i]>='a'&&str[i]<='z'))
- {
- kk=1;
- break;
- }
- else if(str[i]=='_'&&(mm==-1||mm==0)&&i+1<strlen(str))
- {
- strN[j]=str[i+1]+ex;
- j++;
- i++;
- mm=0;
- }
- else if(str[i]>='A'&&str[i]<='Z'&&(mm==-1||mm==1))
- {
- strN[j]='_';
- j++;
- strN[j]=str[i]-ex;
- j++;
- mm=1;
- }
- else if(str[i]>='a'&&str[i]<='z')
- {
- strN[j]=str[i];
- j++;
- }
- else
- {
- kk=1;
- break;
- }
- }
- if(kk==1)
- {
- printf("Error!\n");
- }
- else
- {
- strN[j]='\0';
- puts(strN);
- }
- return 1;
- }
6.百度的新大厦
点击(此处)折叠或打开
- #include<stdio.h>
- #include<string.h>
-
- int main()
- {
- int n,m,i,j,min;
- int u[1000],d[1000],ge[1000];
- scanf("%d%d",&n,&m);
- for(i=0;i<m;i++)
- {
- scanf("%d%d",&u[i],&d[i]);
- }
- for(i=0;i<m;i++)
- {
- for(j=0;j<n;j++)
- {
- if(j*u[i]>(n-j)*d[i])
- {
- break;
- }
- }
- ge[i]=j*u[i]-(n-j)*d[i];
- }
- min=ge[0];
- for(i=0;i<m;i++)
- {
- if(ge[i]<min)
- {
- min=ge[i];
- }
- }
- printf("%d\n",min);
- return 1;
- }