试卷 CSP初赛模拟考试(第03套)
CSP初赛模拟考试(第03套)
单选题
第 1 题    单选题

以下逻辑表达式的值恒为真的是(  ).

A.

B.

C.

D.

第 2 题    单选题

在 8 位二进制补码中,10101011 表示的数是十进制下的(   ).

A.

43

B.

-85

C.

-43

D.

-84

第 3 题    单选题

二进制数 11.01 在十进制下是(   ).

A.

3.25

B.

4.125

C.

6.25

D.

11.125

第 4 题    单选题

把 64 位非零浮点数强制转换成32 位浮点数后,不可能(  ).

A.

大于原数

B.

小于原数

C.

等于原数

D.

与原数符号相反

第 5 题    单选题

提出“存储程序”的计算机工作原理的是(  ).

A.

克劳德·香农

B.

戈登·摩尔

C.

查尔斯·巴贝奇

D.

冯·诺依曼

第 6 题    单选题

如果开始时计算机处于小写输入状态,现在有一只小老鼠反复按照 CapsLock、 字 母键 A、字母键 S 和字母键 D 的顺序循环按键,即 CapsLock、A、S、D、CapsLock、 A、S、D……,屏幕上输出的第 81 个 字符是字母(  )。

A.

A

B.

S

C.

D

D.

a

第 7 题    单选题

原字符串中任意一段连续的字符所组成的新字符串称为子串。 则字符 “AAABBBCCC” 共有(  )个不同的非空子串。

A.

3

B.

12

C.

36

D.

45

第 8 题    单选题

广度优先搜索时,需要用到的数据结构是(   )。

A.

链表

B.

队列

C.

D.

散列表

第 9 题    单选题

通常在搜索引擎中,对某个关键词加上双引号表示(  )。

A.

排除关键词,不显示任何包含该关键词的结果

B.

将关键词分解,在搜索结果中必须包含其中的一部分

C.

精确搜索,只显示包含整个关键词的结果

D.

站内搜索,只显示关键词所指向网站的内容

第 10 题    单选题

将(2, 6, 10, 17)分别存储到某个地址区间为0~10 的哈希表中,如果哈希函数 h(x) = (   ),将不会产生冲突,其中a mod b表示 a 除以 b 的余数。

A.

B.

C.

D.

第 11 题    单选题

考虑如下递归算法,则调用solve(7)得到的返回结果为(  )。

1 solve(n)

2 if n<=1 return 1

3 else if n>=5 return n*solve(n-2)

4 else return n*solve(n-1)

A.

105

B.

840

C.

210

D.

420

第 12 题    单选题

给定一个含N个不相同数字的数组,在最坏情况下,找出其中最大或最小的数,至 少需要 N - 1次比较操作。则最坏情况下,在该数组中同时找最大与 最小的数至少需要( ) 次比较操作。

A.

B.

C.

D.

第 13 题    单选题

一家四口人,至少两个人生日属于同一月份的概率是(  )(假定每个人生日属于每 个月份的概率相同且不同人之间相互独立)。

A.

1/12

B.

1/144

C.

41/96

D.

3/4

第 14 题    单选题

一棵二叉树的前序遍历序列是ABCDEFG,后序遍历序列是CBFEGDA,则根结点 的左子树的结点个数可能是(  )。

A.

2

B.

3

C.

4

D.

5

第 15 题    单选题

2017 年 10 月 1 日是星期日,1999 年 10 月 1 日是(  )。

A.

星期三

B.

星期日

C.

星期五

D.

星期二

阅读程序
第 16-21 题    组合题
#include <cstdlib>
#include <iostream>
using namespace std;

char encoder[26] = {'C','S','P',0};
char decoder[26];

string st;

int main() {
	int k = 0;
	for (int i = 0; i < 26; ++i)
		if (encoder[i] != 0) ++k;
	for (char x ='A'; x <= 'Z'; ++x) {
		bool flag = true;
		for (int i = 0; i < 26; ++i)
			if (encoder[i] ==x) {
				flag = false;
				break;
			}
		if (flag) {
			encoder[k]= x;
			++k;
		}
	}
	for (int i = 0; i < 26; ++i)
		decoder[encoder[i]- 'A'] = i + 'A';
	cin >> st;
	for (int i = 0; i < st.length( ); ++i)
		st[i] = decoder[st[i] -'A'];
	cout << st;
	return 0;
}

?判断题

1) 输入的字符串应当只由大写字母组成,否则在访问数组时可能越界。( )

2) 若输入的字符串不是空串,则输入的字符串与输出的字符串一定不一样。()

3) 将第 12 行的“i < 26”改为“i < 16”,程序运行结果不会改变。( )

4) 将第 26 行的"i < 26”改为“i < 16”,程序运行结果不会改变。( )

?单选题

5) 若输出的字符串为“ABCABCABCA”,则下列说法正确的是( )。

6)若输出的字符串为“CSPCSPCSPCSP”,则下列说法正确的是( )。

1.A. 正确 B. 错误

2.A. 正确 B. 错误

3.A. 正确 B. 错误

4.A. 正确 B. 错误

5.

A. 输入的字符串中既有S又有P

B. 输入的字符串中既有S又有B

C. 输入的字符串中既有A又有P

D. 输入的字符串中既有A又有B

6.

A. 输入的字符串中既有P又有K

B. 输入的字符串中既有J又有R

C. 输入的字符串中既有J又有K

D. 输入的字符串中既有P又有R

第一空(1.5分):____________________

第二空(1.5分):____________________

第三空(2分):____________________

第四空(2分):____________________

第五空(3分):____________________

第六空(3分):____________________

第 16 题 填空
第 17 题 填空
第 18 题 填空
第 19 题 填空
第 20 题 填空
第 21 题 填空
第 22-27 题    组合题
#include<cstdio>
#include<cstring>
using namespace std;
int n, m;
int f[101][101];
intF[101][101];
int main() {
	scanf("%d%d",&n,&m);//n的值在1到100之间
	memset(f,-1,sizeof(f));
	for(int i = 1; i <= m; i++) {
		int u,v,w;//w的值在0到10000之间
		scanf("%d%d%d",&u,&v,&w);
		f[u][v]=f[v][u]=w;
	}
	for(int k = 1; k <= n; k++)
		for(int i=1; i <=n; i++)
			for(int j=1; j<= n; j++)
				if(f[i][k]!=-1&&f[k][j]!=-1)
					if(f[i][j]==-1||f[i][j]>f[k][j]+f[i][k])
						f[i][j]=f[i][k]+f[k][j];
	int ans=2147483647;
	for(int i=1; i<=n; i++)
		for(int j=1; j<=n; j++) {
			for(int x=1; x<=n; x++)
				for(int y=1; y<=n; y++)
					F[x][y]=f[x][y];
			F[i][j]=F[j][i]=0;
			for(int x=1; x<= n; x++)
				for(int y=1; y<=n; y++)
					if(F[x][y]==-1||F[x][y]>F[x][i]+F[i][y])
						F[x][y]=F[x][i]+F[i][y];
			for(int x=1; x<=n; x++)
				for(int y=1; y<=n; y++)
					if(F[x][y]==-1||F[x][y]>F[x][j]+F[j][y])
						F[x][y]=F[x][j]+F[j][y];
			int res=0;
			for(int x=1; x<=n; x++)
				for(int y=1; y<x; y++)
					res +=F[x][y];
			ans=min(res,ans);
		}
	printf("%d\n",ans);
	return 0;
}

●判断题

1)(1分)14到16行,将外层到内层的循环变量依次调整为i、j、k,程序的运行的结果不变。(

)

2)这个程序的时间复杂度和m无关。( )

3)20行的ans如果初始化为10^7时,可能无法得到正确结果。( )

4)若将第27到30行的部分和31到34行的两个部分互换,程序的运行的结果不变。( )

●选择题

5)若输入数据为4 5/1 2 3/1 3 6/2 3 4/2 4 7/3 4 2(其中“/”为换行符),则输出为( )。

A.14

B.18

C.21

D.28

6)这个程序使用了( )算法。

A. Floyd

B. Dijkstra

C. Prim

D. Kruskal

第一空(1分):______________

第二空(2分):______________

第三空(2分):______________

第四空(2分):______________

第五空(3分):______________

第六空(3分):______________

第 22 题 填空
第 23 题 填空
第 24 题 填空
第 25 题 填空
第 26 题 填空
第 27 题 填空
第 28-33 题    组合题
#include<iostream>
using namespace std;
const int V=100;
int n,m,ans,e[V][V];
bool visited[v];
void dfs(int x,int len) {
	int i;
	visited[x]=true;
	if(len>ans) ans=len;
	for(i=1; i<=n; i++)
		if((!visited[i])&&(e[x][i]!=-1))
			dfs(i,len+e[x][i]);
	visited[x]=false;
}
int main() {
	int i,j,a,b,c;
	cin>>n>>m;
	for(i=1; i<=n; i++)
		for(j=1; j<=n; j++)
			e[i][j]=-1;
	for(i=1; i<=m; i++)(
		    cin>>a>>b>>c;
		    e[a][b]=c;
		    e[b][a]=c;
	}
for(i=1; i<=n; i++)
	visited[i]=false;
ans=0;
for(i=1; i<=n; i++)
	dfs(i,0);
cout<<ans<<endl;
return 0;
}

·判断题

(1)第19行的输入中,如果满足m=n*(n-1)/2,则20~22行的初始化可以省略。()

(2)将第31行的代码换成“for(i=n;i>=1;i--)”,程序结果不受任何影响。( )

·选择题

(3)若输入的数据为

4 2

1 2 1

3 4 1

则程序的输出结果是( )。

A. 8

B. 4

C. 2

D. 1

(4)若输入的数据为

4 6

1 2 1

2 3 1

3 4 1

4 1 1

1 3 1

2 4 1

则程序的输出结果是( )。

A.1

B.3

C.5

D.7

(5)若输人的数据为4 3121023203 1 30

则程序的输出结果是( )。

A.30 B.60 C.90 D. 120

(6)若输入的数据为

4 6

1 2 10

2 3 20

3 4 30

4 1 40

1 3 50

2 4 60

则程序的输出结果是()。

A.60 B.100 C.150 D. 200

第一空(1.5分):_____________________

第二空(1.5分):_____________________

第三空(3分):_____________________

第四空(3分):_____________________

第五空(3分):_____________________

第六空(3分):_____________________

第 28 题 填空
第 29 题 填空
第 30 题 填空
第 31 题 填空
第 32 题 填空
第 33 题 填空
第 34-38 题    组合题

(封禁xxs)现有n个xxs(编号为1到n),每个xxs都有一个关注者,第i个xxs的关注

者是a_i。现在管理员要将其中的一些xxs的账号封禁,但需要注意的是如果封禁了第i个人,

那么为了不打草惊蛇,就不能封禁他的关注者a_i。现在想知道最多可以封禁多少个xxs。

输入第一行是一个不超过300000的整数n,第二行是n个1到n的整数表示。

输出一行,一个整数表示答案。

#include<cstdio>
using namespace std;
#define MAXN 300005
int n, ans=0, a[MAXN], in[MAXN]= {0};
bool vis[MAXN]= {0};

void dfs(int cur, int w) {
	if(vis[cur]) 8 return;
	vis[cur]=true;
	if(w==1) ans++;

	①
	if(②)
		dfs(a[cur], ③);

}
int main() {
	scanf("%d",&n);
	for(inti=1; i <=n; i++) {
		scanf(“%d", &a[i]);
		      in[a[i]]++;
	      }
		      for(int i=1;i <= n; i++)
		      if(!in[i]) ④;
		      for(inti=1;i<=n; i++)
		      if(⑤) dfs(i,0);
		      printf("%d\n",ans);
		      return 0;
	      }

1)①处应填( )

A. a[cur]=cur;

B. in[a[cur]]=0;

C. in[a[cur]]--; 

D. in[cur]--;

2)②处应填( )

Ain[a[cur]]!=0||w==1

B.in[a[cur]]==0||w==0

C. in[a[cur]]!=0||w==0 D.in[a[cur]]==0||w==1

3)③处应填( )

A.0

B. 1

C. w D.1-w

4)④处应填( )

A. dfs(i,1)

B. dfs(i,0)

C.dfs(a[i], 1) D. dfs(a[i], 0)

5)⑤处应填( )

A. !in[i]

B. in[i]

C. !vis[i] D. vis[I]

第一空(3分):_____________

第二空(3分):_____________

第三空(3分):_____________

第四空(3分):_____________

第五空(3分):_____________


第 34 题 填空
第 35 题 填空
第 36 题 填空
第 37 题 填空
第 38 题 填空
第 39-43 题    组合题

完善程序:

(二叉查找树) 二叉查找树具有如下性质: 每个节点的值都大于其左子树上所有节点的值、

小于其右子树上所有节点的值。试判断一棵树是否为二叉查找树。

输入的第一行包含一个整数n,表示这棵树有n 个顶点, 编号分别为 1, 2, ... ,n,其中编号为

1 的为根结点。之后的第 i 行有三个数value, left_childleft , 

right_child,分别表示该节点关键字的值、左子节点的编号、右子节点的编号;如果不存在

左子节点或右子节点,则用 0 代替。输出 1 表示这棵树是二叉查找树,输出0 则表示不是。

#include <iostream>
using namespace std;
const int SIZE = 100;
const int INFINITE = 1000000;
struct node {
	int left_child, right_child, value;
};
node a[SIZE];
int is_bst( int root, int lower_bound, int upper_bound ) {
	int cur;
	if ( root == 0 )
		return(1);
	cur = a[root].value;
	if ( (cur > lower_bound) && ( ① ) && (is_bst( a[root].left_child,
	                                       lower_bound, cur ) == 1) && (is_bst( ②, ③, ④ ) == 1) )
		return(1);
	return(0);
}
int main() {
	int i, n;
	cin >> n;
	for ( i = 1; i <= n; i++ )
		cin >> a[i].value >> a[i].left_child >> a[i].right_child;
	cout << is_bst( ⑤, -INFINITE, INFINITE ) << endl;
	return(0);
}

第一空(3分):______________

第二空(3分):______________

第三空(3分):______________

第四空(3分):______________

第五空(2分):______________

第 39 题 填空
第 40 题 填空
第 41 题 填空
第 42 题 填空
第 43 题 填空
答题卡
单选题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
阅读程序
题目总数:20
总分数:43
时间:120分钟
QQ
微信