CCFCSPJ入门级CC++语言试题与答案解析Word格式文档下载.docx
《CCFCSPJ入门级CC++语言试题与答案解析Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《CCFCSPJ入门级CC++语言试题与答案解析Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
:
程序设计基础-算法与数据结构■折半査找(二分查找)
对100个有序元素进行折半查找,每次查找可将检索范围缩小一半。
由2”-1〈100"
27-1可知,最大比较次数为7。
6・链表不具有的特点是()
A.插入删除不需要移动元素B.不必事先估计存储空间
C.所需空间与线性表长度成正比D.可随机访问任一元素
程序设计基础■算法与数据结构-链表
链表是通过记录每个元素的后继位置來实现数据存储,所需空间与元素个数成正比,优点是不必事先估汁存储空间、插入或删除指定位置元素的时间复杂度为0
(1):
但缺点是由于其元素的内存地址不连续,无法进行0
(1)的随机访问。
7・把8个同样的球放在5个同样的袋子里,允许有的袋子空着不放,问共有多少冲不同的分法?
()提示:
如果8个球都放在一个袋子里,无论足哪个袋子,都只算同一种分法
A.22B.24C.18D.20
答考解案合
案:
点:
数学■计数问题
析:
枚举法求解,8个同样的球分1个袋子共1种方案,分2个袋子共4种方,分3个袋子共5种方案,分4个袋子共5种方案,分5个袋子共3种方案,计18种。
&
一棵二叉树如右图所示,若采用顺序存储结构,即用维数组元素存储该二叉树中的结点(根结点的下标为1,若某结点的下标为i,则英左孩子位于下标2i处.右孩子位于下标2i+l处),则该数组的展大下标至少为()。
答考解点
程序设计基础-算法与数据结构-树结构
根据题目给定的规则可知,下标最大的结点为树中深度最大且最靠右的结,其下标为((l*2+l)*2+l)*2+l=15o
9.
100以内最人的索数是()。
A.89B.97
B
数学-素数与合数
98・100均为合数,97为素数。
10.319和377的最大公约数是()。
A.27B.33C.29D.31
数学■公约数与公倍数
解析:
使用辗转相除法可得GCI)(319,377)=GCD(319,58)=GCD(58,29)=290或将两数分解质因数后,提取公共部分亦可求解。
11.新学期开学了,小胖想减肥,健身教练给小胖制定了两个训练方案。
方案一:
每次连续跑3公里口J以消耗300千卡(耗时半小时):
方案二:
每次连续跑5公里可以消耗600千卡(耗时1小时)。
小胖每周周一到周四能抽出半小时跑步,周五到周口能抽出-小时跑步。
另外,教练遂议小胖每周最名跑21公里,否则会损伤膝孟。
请问如果小胖想严格执行教练的训练方案,并且不想损伤膝盖,每周最参通过跑步消耗多少千卡?
()
A.3000B.2500C.2400D.2520
程序设计基础••算法与数据结构■枚举算法
设方案1执行x天,方案2执行y天,则有3x+5y<
=21>
x+y<
=7、y<
=30要求300x+600y的最大值,枚举可得最优方案为x=2、y=3,此时300x+600y为2400.或使用线性规划亦可求解。
12•—副纸牌除掉大小王有52张牌,四种花色,每种花色13张。
假设从这52张牌中随机抽取13张纸牌,则至少()张牌的花色一致。
A.4B.2C.3D.5
数学■抽屉原理
最坏情况,13张牌对应四种花色的牌数为3、3、3、4o
13.—吐数字可以颠倒过来看,例如0、1、8颠倒过来还是本身,6颠倒过来是
9,9颠倒过来看还是6,其他数字颠倒过来都不构成数字。
类似的,一些多位数也可以颠倒过来看,比如106颠倒过来是901o假设某个城市的车牌只山5位数字组成,每-•位都可以取0到9。
请问这个城市就多有多少个车牌倒过来恰好还是原来的车牌?
A.60B.125C.75D.100
答案:
数学■乘法原理
前2位有0、1、&
6、9共5种选择,第3位只能放0、1、8,后2位由前2位决定,因此总方案数为5*5*3*l*l=75o
14.假设一棵二叉树的后序遍历呼列为DGJHEBII'
CA,序遍历用列为DBGEIIJACIF,则其前序遍历序列为()。
A.ABCDEFGIIIJB.ABDEGHJCFIC.ABDEGJIICFID.ABDEGHJFIC答案:
后序遍历的规则是“左右根”、中序遍历的规则是'
'
左根右”,因此可知,A是树根、DBGE町是A左子树的中序遍历(对应后续遍历DGJHEB)、CIF是A右子树的中序遍历(对应后续遍历IFC),递归画出对应的二叉树,再根据前序遍历规则“根左右”即可求出答案。
15.以下哪个奖项是计算机科学领域的最高奖?
A.图灵奖B.再班奖C.诺贝尔奖D.普利策奖
计算机基础-常识■重要人物
图灵奖由美国计算机协会于1966年设、'
/:
其名称取自计算机科学之父图灵,专门奖励对计算机事业作出重要贡献的个人,被誉为“计算机界的诺贝尔奖”。
二、阅读程序(程序输入不超过数组或字符串定义的范围;
判断题正确填错误填X;
除特殊说明外,判断题1.5分,选择题4分,共计40分)
程序一
1#inelude<
cstdio>
2#include<
cstring>
3usingnamespacestd;
4charst[100];
5intmain(){
6scanf('
^s"
jst);
7intn=strlen(st);
8
for(inti=
1;
i<
=n;
++i){
9
if(n%i:
==0){
10
charc=
妣[i・1];
11
if(c>
=
•a*)
12
st[i・
1]=c・'
a,+*A'
;
13
}
14
15
printf(,l%s\
st);
16
return0;
17
程序设汁基础-算法与数据结构-字符串
概述:
程序用于将字符串下标(如果从1开始编号,但C++语言中实际是从0开始编号)是n约数的对应小写字母转换为大写字母。
•判断题
1)输入的字符串只能由小写字母或大写字冊组成。
()答案:
错
输入的字符串也可以包含数字等其他字符。
2)若将第8行的“i=1”改为“i=0°
程序运行时会发牛错误。
对
若i可以为0,则第9行的辻语句条件“n%i=0”将发生运行时错误REo
3)若将第8行的“i<
=n”改为“i*i<
=n”,程序运行结果不会改变。
当第8行的循环条件为“iOn”时,字符串的末尾字符会被程序加工,但
若改为“i*i<
=n”,字符串的末尾字符将不会被程序加工(除非字符串长度为1)。
4)若输入的字符串全部由大写字母组成,那么输出的字符串就跟输入的字符串一样。
大写字母的ASCII编码值小于小写字母的。
若输入的字符串全部由大写字母组成,则程序不会对其进行加工。
•选择题
5)若输入的字符巾长度为18,那么输入的字符阳跟输出的字符妝相比,至多有()个字符不同。
A.18B.6C.10D.1
18的止约数共有6个,因此程序至多修改输入字符串中的6个字符,即输出字符串与输入字符串至多有6个字符不同。
。
6)若输入的字符串长度为(),那么输入的字符串跟输岀的字符串相比,至多有36个字符不同。
A.36B.100000C・1D.128
根据程序的作用可知,要使输出字符串和输入字符串之间至多有36个字符不同,36应当是字符串长度n的约数个数。
木题选项中,仅有100000满足要求,将其分解质因数得1000002环5"
得其的止约数共有(5+1)*(5+1)=36个。
程序二
2usingnamespacestd;
3intn,m;
4inta[100],b[100];
5
6
intmain(){
7
scanf(,,%d%d,,>
n,&
m);
++i)
a[i]=b[i]
=0;
=m;
intx»
y;
scanf(il%d%d\&
y);
if(a[x]<
y&
b[y]<
x){
if(a[x]
>
0)
b[a[x]]
=0;
if(b[y]
a[b[y]]
18
a[x]=y;
19
b[y]=x;
20
21
22
intans=0;
23
24
if(a[i]==
0)
25
++ans;
26
if(b[i]==
27
++dns;
28
29
printf(u%d\nM
ans);
30
31
假设输入的n和m都是正整数,x和y都是4[1,n]的范围内的整数,完成下面的判断题和单选题:
程序设计基础■算法与数据结构■模拟算法
程序可以视作通过模拟算法选出一系列互不冲突的数对一一若数对g,yj和(x?
yj之间有x.==x2或*则认为这两个数对存在冲突,现按顺序考虑每一个数对(Xi,yj(要求满足前提:
在已经选用的数对中,与左值Xi匹配的右值小于力、与右值y:
匹配的左值小于,若该数对与此前已经选用的数对冲突,则用当前数对替换所冲突的原数对:
若无冲突,则直接选用当前数对。
程序中的Hx]用于记录,在己选用的数对中,与左值x相匹配的右值;
b[y]用于记录,在已选用的数对中,与右值y相比配的左值;
n表示数对左值和右值的取值范国为[l,n]:
最后的ans用于统计剩余多少左值或右值,没有相应数对被我们选中。
判断题
1)当m>
0时,输出的值一定小于2n°
()
由限定条件0<
x,y<
=n可知,当m>
0时,一定存在某个数对被我们选中,此时ans<
2n
2)执行完第27行的“++ans"
时,ans—定是偶数。
山于数对是一个左值与一个右值相匹配,因此ansM终一定是偶数。
但第27行的“++ans”在第23行的for循环的内部,其中间结果可能为奇数。
3)a[i]和b[i]不可能同时大于0。
[i]用于记录与左值i相匹配的右值,不存在则为0;
b[i]用于记录与右值i相匹配的左值,不存在则为0。
当存在数对(i,y)和(x,i)都被我们选中时,a[i]和b[i]就会同时大于0o
4)若程序执行到第13行时,x总是小于y,那么第15行不会被执行。
存在反例一一依次考虑数对(1,2)(1,3)时,第15行程序会被执行。
5)若m个x两两不同,且m个y两两不同,则输出的值为()
A.2n-2mB.2n+2C.2n-2D.2n
此时,输入的数对两两互不冲突,因此程序会将它们全部选中,根据上述ans的意义可知,其结果为2n-2mo
6)若m个x两两不同,且m个y都相等,则输出的值为()
A.2n~2B.2nC・2mI).2n~2m
答案;
此时,输入的数对两两存在冲突,因此程序最终只会选用一个数对,根据上述ans的意义可知,其结果为2n-2o程序三
iostream>
3constintmaxn=10000;
4intn;
5inta[maxn];
6intb[maxn];
7intf(int1,intr,intdepth){
8if(1>
r)
9return0;
intmin=maxn》mink;
for
(int
i=1;
=r;
il
F(min
a[i]){
min=
a[i];
mink:
=i;
int
Ires
=f(ljmink-1,depth
+1);
rres
=f(mink+1,depth
19returnIres+rres+depth♦b[mink];
20}
21intmain(){
cin>
n;
for(inti=0;
a[i];
b[i];
cout<
<
f(0^n・1,1)<
endl;
程序设计基础■算法与数据结构-树结构
程序可以视作根据二叉树的中序遍历,构造一棵满足要求的树,并输出各结点深度与b值的加权和一一要求二叉树的根结点般小,并递归要求左右子树的根结点最小(除非相应子树为空)。
1)如果a数组有重复的数字,则程序运行时会发生错误。
若a数组有重复数字,则程序在根据a数组递归构造符合要求的二叉树时,对于相同结点值,会优先考虑位于左侧的。
2)如果b数组全为0,则输岀为0。
程序最终输出的是各结点深度与b值的加权和,因此若b数组全为0,则加权和显然为0。
3)当n=100时,最坏情况下,与第12行的比较运算执行的次数最接近的是:
()。
A.5000B.600C・6D.100
最坏情况下,程序所构造的二叉树的每个结点至多仅有一个子结点,此时,将递归100层,其中第i层进行100-i+l次第12行的比较运算,总执行次
4)n=100时,最好情况匚与第12行的比较运算执行的次数最接近的是:
A.100B.6C.5000D.600
最佳情况下,程序构造二叉树时,对于每个结点会尽可能均分英左右子树。
定义根结点深度为1,则含n=100个结点的树的深度最小为logn^7,此时每选定一层结点,程序都盂要执行约n次的第12行的比较运算,因此总执行次数约为nlogn~600。
5)当n=10时.若b数组满足,对任意OSiVm都有b[i]=i4-1.那么输出垠大为()。
A.386B.383C.384D.385
此时,要使输出的ans值尽可能大,程序所松造的二叉树的深度应尽可能地大。
定义根结点深度为1,则含10个结点的二叉树的最大深度为10,因此ans的最大值为1*1+2*2+3*3+・-+10*10=385。
6)(4分)当n=100吋,若b数组满足,对任意OSiVn,都有b[i]=
1,那么输出最小为()。
A.582B.580C.579I).581
此时,要使输出的ans值尽可能小,程序应参照完全二叉树构造此树,其中深度为1的结点共1个,深度为2的结点共2个,深度为3的结点共4个……深度为6的结点共32个,剩余37个结点的深度为7,因此ans的最小值为
(1*1-2*2+3*4+・・・+6*32)+7*37=580。
三、完善程序(单选题,每题3分,共计30分)
(矩阵变幻)有一个奇幻的矩阵,在不停的变幻,其变幻方式为:
数字0变成矩阵昨;
],数字1变成矩阵I:
J]o最初该矩阵只有一个元素0,变幻n次后,矩阵会变成什么样?
例如,矩阵鼓初为:
[0]:
矩阵变幻1次后:
[JJ]:
矩阵变幻2次后:
0000
0101
0011
Lo11oJ
输入一行一个不超过10的止整数no输出变幻n次后的矩阵.
试补全程序。
提示:
“<
”表示二进制左移运算符,例如(11)2«
2=(1100)2;
而“八”表示二进制异或运算符,它将两个参与运算的数中的每个对应的二进制位一一进行比较,若两个二进制位相同,则运算结果的对应二进制位为0,反之为
1#include<
3intn;
4constintmax_size=1<
10;
5intres[max_size][max_size];
6voidrecursive(intx,inty,intn,intt){
7if(n==0){
8res[x][y]=①;
9return;
10}
11intstep=1<
(n-1);
12recursive(②,n・1,t);
13recursive(x?
y+step,n・t);
14recursive(x+step,y,n•1,t);
15recursive(③,n・1,!
t);
16}
17intmain(){
18scanf(H%dH,&
n);
19recursive(0,0,④);
20intsize=⑤;
21for(inti=0;
size;
22for(intj=0;
j<
++j)
23printf("
%dM,res[i][j]);
24puts(““);
25}
26return0;
27}
程序设计基础-算法与数据结构-分治算法
程序采用分治算法,递归模拟矩阵的变换过程。
递归函数
recursive(x,y,n,t)表示计算左上角(x,y),大小2"
*2"
ftl单个数字t变幻而來的矩阵。
1)①处应填()
A.n%2B.0C.tD.1
此处为递归边界,当需要计算的是氓位矩阵时,相应元素应赋值为t,即无需再经任何变换。
2)②处应填()
A.x-step,y-stepB・x,y・step
C.x・step,yD.x,y
左上角(x,y),且大小2*2"
的矩阵,可以分成4个2"
*2心的矩阵分别计算。
此处需要计算的是4个矩阵中位于左上方的矩阵,该矩阵的左上角坐标为(x,y)o
B・x+step,y+step
I).x»
y•stap
!
B
的矩阵,可以分成4个2n,*2nH的矩阵分别计此处需要计算的是4个矩阵中位于右下方的矩阵,该矩阵的左上角坐标为nI,y+2n,)o
4)④处应填(〉
A.n■1,n%2B・n,0
C.n%2D.n-1^0
此处是递归计算的入口,即题目最终所求的是大小2*2"
由单个数字0变幻闻来的矩阵,因此递归函数的后两个参数应设为n和0。
5)⑤处应填()
A.1<
(n+1)B.1<
n
C.n+1I).1«
(n・1)
此处是讣算最终所求的矩阵大小,即边Ksizc为賂位运算写做"
l«
n\程序二
2.(计数排序)计数排序足一个广泛使用的排序方法。
下面的程序使用双关键字计数排序,将n对10000以内的整数,从小到大排序。
例如有三对整数(3,4)、(2,4)、(3,3),那么排序之后应该是(2,4)、(3,3)、(3,4)o
输入第一行为m接下来n行.第i行有两个数n[i]和b[i]・分别表示第i对整数的第一关键字和笫二关键字。
从小到大排序后输出。
数据范围l<
n^l07,l^a[ab[i]^10\
提示,应先对第二关键字排序,再对第一关键字排序V数组ord[]存储第二关键字排序的结果,数组res[]存储双关键字排序的结果。
2#inelude<
4constintmaxn=10000000;
5constintmaxs=10000;
6intn;