第五届蓝桥杯软件类省赛真题CC++本科A组.docx
《第五届蓝桥杯软件类省赛真题CC++本科A组.docx》由会员分享,可在线阅读,更多相关《第五届蓝桥杯软件类省赛真题CC++本科A组.docx(16页珍藏版)》请在冰豆网上搜索。
第五届蓝桥杯软件类省赛真题CC++本科A组
2014年预赛C/C++本科A组
考生须知:
考试开始后,选手首先下载题目,并使用考场现场公布的解压密码解压试题。
考试时间为4小时。
时间截止后,提交答案无效。
在考试强制结束前,选手可以主动结束考试(需要身份验证),结束考试后将无法继续提交或浏览答案。
选手可浏览自己已经提交的答案。
被浏览的答案允许拷贝。
对同一题目,选手可多次提交答案,以最后一次提交的答案为准。
选手切勿在提交的代码中书写“姓名”、“考号”,“院校名”等与身份有关的信息或其它与竞赛题目无关的内容,否则成绩无效。
选手必须通过浏览器方式提交自己的答案。
选手在其它位置的作答或其它方式提交的答案无效。
试题包含三种类型:
“结果填空”、“代码填空”与“程序设计”。
结果填空题:
要求选手根据题目描述直接填写结果。
求解方式不限。
不要求源代码。
把结果填空的答案直接通过网页提交即可,不要书写多余的内容。
代码填空题:
要求选手在弄清给定代码工作原理的基础上填写缺失的部分,使得程序逻辑正确、完整。
所填写的代码不超过一条语句(即中间不能出现分号)。
把代码填空的答案(仅填空处的答案,不包括题面已存在的代码或符号)直接通过网页提交即可,不要书写多余的内容。
使用ANSIC/ANSIC++标准,不要依赖操作系统或编译器提供的特殊函数。
程序设计题目:
要求选手设计的程序对于给定的输入能给出正确的输出结果。
考生的程序只有能运行出正确结果才有机会得分。
注意:
在评卷时使用的输入数据与试卷中给出的示例数据可能是不同的。
选手的程序必须是通用的,不能只对试卷中给定的数据有效。
对于编程题目,要求选手给出的解答完全符合ANSIC++标准,不能使用诸如绘图、Win32API、中断调用、硬件操作或与操作系统相关的API。
代码中允许使用STL类库。
注意:
main函数结束必须返回0
注意:
所有依赖的函数必须明确地在源文件中#include,不能通过工程设置而省略常用头文件。
所有源码必须在同一文件中。
调试通过后,拷贝提交。
提交时,注意选择所期望的编译器类型。
结果填空(满分2分)
标题:
猜年龄
小明带两个妹妹参加元宵灯会。
别人问她们多大了,她们调皮地说:
“我们俩的年龄之积是年龄之和的6倍”。
小明又补充说:
“她们可不是双胞胎,年龄差肯定也不超过8岁啊。
”
请你写出:
小明的较小的妹妹的年龄。
注意:
只写一个人的年龄数字,请通过浏览器提交答案。
不要书写任何多余的内容。
结果填空(满分5分)
标题:
切面条
一根高筋拉面,中间切一刀,可以得到2根面条。
如果先对折1次,中间切一刀,可以得到3根面条。
如果连续对折2次,中间切一刀,可以得到5根面条。
那么,连续对折10次,中间切一刀,会得到多少面条呢?
答案是个整数,请通过浏览器提交答案。
不要填写任何多余的内容。
结果填空(满分7分)
标题:
神奇算式
由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。
比如:
210x6=1260
8x473=3784
27x81=2187
都符合要求。
如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。
请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:
列出所有算式)。
代码填空(满分6分)
标题:
史丰收速算
史丰收速算法的革命性贡献是:
从高位算起,预测进位。
不需要九九表,彻底颠覆了传统手算!
速算的核心基础是:
1位数乘以多位数的乘法。
其中,乘以7是最复杂的,就以它为例。
因为,1/7是个循环小数:
0.142857...,如果多位数超过142857...,就要进1
同理,2/7,3/7,...6/7也都是类似的循环小数,多位数超过n/7,就要进n
下面的程序模拟了史丰收速算法中乘以7的运算过程。
乘以7的个位规律是:
偶数乘以2,奇数乘以2再加5,都只取个位。
乘以7的进位规律是:
满142857...进1,
满285714...进2,
满428571...进3,
满571428...进4,
满714285...进5,
满857142...进6
请分析程序流程,填写划线部分缺少的代码。
//计算个位
intge_wei(inta)
{
if(a%2==0)
return(a*2)%10;
else
return(a*2+5)%10;
}
//计算进位
intjin_wei(char*p)
{
char*level[]={
"142857",
"285714",
"428571",
"571428",
"714285",
"857142"
};
charbuf[7];
buf[6]='\0';
strncpy(buf,p,6);
inti;
for(i=5;i>=0;i--){
intr=strcmp(level[i],buf);
if(r<0)returni+1;
while(r==0){
p+=6;
strncpy(buf,p,6);
r=strcmp(level[i],buf);
if(r<0)returni+1;
______________________________;//填空
}
}
return0;
}
//多位数乘以7
voidf(char*s)
{
inthead=jin_wei(s);
if(head>0)printf("%d",head);
char*p=s;
while(*p){
inta=(*p-'0');
intx=(ge_wei(a)+jin_wei(p+1))%10;
printf("%d",x);
p++;
}
printf("\n");
}
intmain()
{
f("428571428571");
f("34553834937543");
return0;
}
注意:
通过浏览器提交答案。
只填写缺少的内容,不要填写任何多余的内容(例如:
说明性文字)
代码填空(满分11分)
标题:
锦标赛
如果要在n个数据中挑选出第一大和第二大的数据(要求输出数据所在位置和值),使用什么方法比较的次数最少?
我们可以从体育锦标赛中受到启发。
如图【1.png】所示,8个选手的锦标赛,先两两捉对比拼,淘汰一半。
优胜者再两两比拼...直到决出第一名。
第一名输出后,只要对黄色标示的位置重新比赛即可。
下面的代码实现了这个算法(假设数据中没有相同值)。
代码中需要用一个数组来表示图中的树(注意,这是个满二叉树,不足需要补齐)。
它不是存储数据本身,而是存储了数据的下标。
第一个数据输出后,它所在的位置被标识为-1
//重新决出k号位置,v为已输出值
voidpk(int*a,int*b,intn,intk,intv)
{
intk1=k*2+1;
intk2=k1+1;
if(k1>=n||k2>=n){
b[k]=-1;
return;
}
if(b[k1]==v)
pk(a,b,n,k1,v);
else
pk(a,b,n,k2,v);
//重新比较
if(b[k1]<0){
if(b[k2]>=0)
b[k]=b[k2];
else
b[k]=-1;
return;
}
if(b[k2]<0){
if(b[k1]>=0)
b[k]=b[k1];
else
b[k]=-1;
return;
}
if(______________________)//填空
b[k]=b[k1];
else
b[k]=b[k2];
}
//对a中数据,输出最大,次大元素位置和值
voidf(int*a,intlen)
{
intn=1;
while(nint*b=(int*)malloc(sizeof(int*)*(2*n-1));
inti;
for(i=0;iif(ib[n-1+i]=i;
else
b[n-1+i]=-1;
}
//从最后一个向前处理
for(i=2*n-1-1;i>0;i-=2){
if(b[i]<0){
if(b[i-1]>=0)
b[(i-1)/2]=b[i-1];
else
b[(i-1)/2]=-1;
}
else{
if(a[b[i]]>a[b[i-1]])
b[(i-1)/2]=b[i];
else
b[(i-1)/2]=b[i-1];
}
}
//输出树根
printf("%d:
%d\n",b[0],a[b[0]]);
//值等于根元素的需要重新pk
pk(a,b,2*n-1,0,b[0]);
//再次输出树根
printf("%d:
%d\n",b[0],a[b[0]]);
free(b);
}
intmain()
{
inta[]={54,55,18,16,122,17,30,9,58};
f(a,9);
}
请仔细分析流程,填写缺失的代码。
通过浏览器提交答案,只填写缺失的代码,不要填写已有代码或其它说明语句等。
结果填空(满分12分)
标题:
扑克序列
AA223344,一共4对扑克牌。
请你把它们排成一行。
要求:
两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。
请填写出所有符合要求的排列中,字典序最小的那个。
例如:
22AA3344比A2A23344字典序小。
当然,它们都不是满足要求的答案。
请通过浏览器提交答案。
“A”一定不要用小写字母a,也不要用“1”代替。
字符间一定不要留空格。
程序设计(满分10分)
标题:
蚂蚁感冒
长100厘米的细长直杆子上有n只蚂蚁。
它们的头有的朝左,有的朝右。
每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。
当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。
这些蚂蚁中,有1只蚂蚁感冒了。
并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。
请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
【数据格式】
第一行输入一个整数n(1接着的一行是n个用空格分开的整数Xi(-100正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。
其中,第一个数据代表的蚂蚁感冒了。
要求输出1个整数,表示最后感冒蚂蚁的数目。
例如,输入:
3
5-28
程序应输出:
1
再例如,输入:
5
-108-201225
程序应输出:
3
资源约定:
峰值内存消耗<256M
CPU消耗<1000ms
请严格按要求输出,不要画蛇添足地打印类似:
“请您输入...”的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:
main函数需要返回0
注意:
只使用ANSIC/ANSIC++标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意:
所有依赖的函数必须明确地在源文件中#include,不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
仔细阅读程序的输入、输出要求,千万不要输出没有要求的、多余的内容,例如:
“请您输入xx数据:
”。
建议仔细阅读示例,不要想当然!
程序处理完一个用例的数据后,立即退出(return0),千万不要循环等待下一个用例的输入。
程序必须使用标准输入、标准输出,以便于机器评卷时重定向。
对于编程题目,要求选手给出的解答完全符合ANSIC++标准,不能使用诸如绘图、Win32API、中断调用、硬件操作或与操作系统相关的API。
代码中允许使用STL类库。
注意:
main函数结尾需要return0
注意:
所有依赖的函数必须明确地在源文件中#include,不能通过工程设置而省略常用头文件。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
提交时,注意选择所期望的编译器类型。
程序设计(满分12分)
标题:
地宫取宝
X国王有一个地宫宝库。
是nxm个格子的矩阵。
每个格子放一件宝贝。
每个宝贝贴着价值标签。
地宫的入口在左上角,出口在右下角。
小明被带到地宫的入口,国王要求他只能向右或向下行走。
走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。
当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明。
请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝。
【数据格式】
输入一行3个整数,用空格分开:
nmk(1<=n,m<=50,1<=k<=12)
接下来有n行数据,每行有m个整数Ci(0<=Ci<=12)代表这个格子上的宝物的价值
要求输出一个整数,表示正好取k个宝贝的行动方案数。
该数字可能很大,输出它对1000000007取模的结果。
例如,输入:
222
12
21
程序应该输出:
2
再例如,输入:
232
123
215
程序应该输出:
14
资源约定:
峰值内存消耗<256M
CPU消耗<1000ms
请严格按要求输出,不要画蛇添足地打印类似:
“请您输入...”的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:
main函数需要返回0
注意:
只使用ANSIC/ANSIC++标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意:
所有依赖的函数必须明确地在源文件中#include,不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
仔细阅读程序的输入、输出要求,千万不要输出没有要求的、多余的内容,例如:
“请您输入xx数据:
”。
建议仔细阅读示例,不要想当然!
程序处理完一个用例的数据后,立即退出(return0),千万不要循环等待下一个用例的输入。
程序必须使用标准输入、标准输出,以便于机器评卷时重定向。
对于编程题目,要求选手给出的解答完全符合ANSIC++标准,不能使用诸如绘图、Win32API、中断调用、硬件操作或与操作系统相关的API。
代码中允许使用STL类库。
注意:
main函数结尾需要return0
注意:
所有依赖的函数必须明确地在源文件中#include,不能通过工程设置而省略常用头文件。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
提交时,注意选择所期望的编译器类型。
程序设计(满分15分)
标题:
斐波那契
斐波那契数列大家都非常熟悉。
它的定义是:
f(x)=1....(x=1,2)
f(x)=f(x-1)+f(x-2)....(x>2)
对于给定的整数n和m,我们希望求出:
f
(1)+f
(2)+...+f(n)的值。
但这个值可能非常大,所以我们把它对f(m)取模。
公式参见【图1.png】
但这个数字依然很大,所以需要再对p求模。
【数据格式】
输入为一行用空格分开的整数nmp(0输出为1个整数
例如,如果输入:
235
程序应该输出:
0
再例如,输入:
151129
程序应该输出:
25
资源约定:
峰值内存消耗<256M
CPU消耗<1000ms
请严格按要求输出,不要画蛇添足地打印类似:
“请您输入...”的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:
main函数需要返回0
注意:
只使用ANSIC/ANSIC++标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意:
所有依赖的函数必须明确地在源文件中#include,不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
仔细阅读程序的输入、输出要求,千万不要输出没有要求的、多余的内容,例如:
“请您输入xx数据:
”。
建议仔细阅读示例,不要想当然!
程序处理完一个用例的数据后,立即退出(return0),千万不要循环等待下一个用例的输入。
程序必须使用标准输入、标准输出,以便于机器评卷时重定向。
对于编程题目,要求选手给出的解答完全符合ANSIC++标准,不能使用诸如绘图、Win32API、中断调用、硬件操作或与操作系统相关的API。
代码中允许使用STL类库。
注意:
main函数结尾需要return0
注意:
所有依赖的函数必须明确地在源文件中#include,不能通过工程设置而省略常用头文件。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
提交时,注意选择所期望的编译器类型。
程序设计(满分20分)
标题:
波动数列
观察这个数列:
1302-11-2...
这个数列中后一项总是比前一项增加2或者减少3。
栋栋对这种数列很好奇,他想知道长度为n和为s而且后一项总是比前一项增加a或者减少b的整数数列可能有多少种呢?
【数据格式】
输入的第一行包含四个整数nsab,含义如前面说述。
输出一行,包含一个整数,表示满足条件的方案数。
由于这个数很大,请输出方案数除以100000007的余数。
例如,输入:
41023
程序应该输出:
2
【样例说明】
这两个数列分别是2413和741-2。
【数据规模与约定】
对于10%的数据,1<=n<=5,0<=s<=5,1<=a,b<=5;
对于30%的数据,1<=n<=30,0<=s<=30,1<=a,b<=30;
对于50%的数据,1<=n<=50,0<=s<=50,1<=a,b<=50;
对于70%的数据,1<=n<=100,0<=s<=500,1<=a,b<=50;
对于100%的数据,1<=n<=1000,-1,000,000,000<=s<=1,000,000,000,1<=a,b<=1,000,000。
资源约定:
峰值内存消耗<256M
CPU消耗<1000ms
请严格按要求输出,不要画蛇添足地打印类似:
“请您输入...”的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:
main函数需要返回0
注意:
只使用ANSIC/ANSIC++标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意:
所有依赖的函数必须明确地在源文件中#include,不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
建议仔细阅读示例,不要想当然!
程序处理完一个用例的数据后,立即退出(return0),千万不要循环等待下一个用例的输入。
程序必须使用标准输入、标准输出,以便于机器评卷时重定向。
对于编程题目,要求选手给出的解答完全符合ANSIC++标准,不能使用诸如绘图、Win32API、中断调用、硬件操作或与操作系统相关的API。
代码中允许使用STL类库。
注意:
main函数结尾需要return0
注意:
所有依赖的函数必须明确地在源文件中#include,不能通过工程设置而省略常用头文件。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
提交时,注意选择所期望的编译器类型。