CSP 2021 入门组初赛第一轮试题

2021 CCF 非专业级别软件能力认证第一轮

(CSP-J1) 入门级 C 语言试题

认证时间: 2021年9月19日 14:30 ~16:30

1.以下不属于面向对象程序设计语言是

A. C++

B. Python

C. Java

D. C

2.以下奖项与计算机领域相关的是

A. 奥斯卡奖

B. 图灵奖

C. 诺贝尔奖

D. 普利策奖

3.目前主流的计算机存储数据最终都是转换成( ) 数据进行存储的

A. 二进制

B. 十进制

C. 八进制

D. 十六进制

4.以比较作为基本运算,在N个数中找出最大数,最坏情况下所需要的最少比较次数为

A. \(N^2\)

B. N

C. N-1

D. N+1

5.对于入栈顺序为a,b,c,d,e的序列,下列( )不合法的出栈序列

A. a,b,c,d,e

B. e,d,c,b,a

C. b,a,c,d,e

D. c,d,a,e,b

6.对于有n个顶点、m条边的无向连通图(m>n),需要删掉( )条边才能使其成为一棵树

A. n-1

B. m-n

C. m-n-1

D. m-n+1

7.二进制数101.11对应的十进制数是( )

A. 6.5

B. 5.5

C. 5.75

D. 5.25

8.如果一颗二叉树只有根节点,那么这棵二叉树高度为1。请问高度为5的完全二叉树有( )种不同的形态

A. 16

B. 15

C. 17

D. 32

9.表达式a* (b+c)* d的后缀表达式为( ),其中 *和 +是运算符

A. * * a + b c d

B. a b c + * d *

C. a b c + d * *

D. * a * + b c d

10.6个人,两个人组一对,总共组成三队,不区分队伍的编号。不同的组队情况有( )

A. 10

B. 15

C. 30

D. 20

11.在数据压缩编码中的哈夫曼编码方法,在本质上是一种( ) 策略

A. 枚举

B. 贪心

C. 递归

D. 动态规划

12.由 1,1,2,2,3这五个数字组成不同的三位数有( )种

A. 18

B. 15

C. 12

D. 24

13.考虑如下递归算法

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

则调用solve(7)得到的返回结果为( )

A. 105

B. 840

C. 210

D. 420

14.以a为起点,对右边的无向图进行深度优先遍历,则b、c、d、e四个点中有可能作为最后一个遍历的点的个数为( )

A. 1

B. 2

C. 3

D. 4

15.有四个人要从A点坐一条船过河到B点,船一开始在A点。该船一次最多可坐两个人。已知这四个人中每个人独自坐船的过河时间分别为1、2、4、8,且两个人坐船的过河时间为两人独自过河时间的较大者。则最短( )时间可以让四个人都过河到B点(包括从B点把船开回A点的时间)

A. 14

B. 15

C. 16

D. 17

二 阅读程序(判断题1.5分 选择题3分 共计40分 )

#include<stdio.h>

int n;
int a[1000];

int f(int x)
{
	int ret = 0;
	for(;x;x&=x-1) ret++;
	return ret;
}

int g(int x)
{
	return x & -x;
}

int main()
{
	scanf("%d",&n);
	for (int i=0;i<n;i++) scanf("%d",&a[i]);
	for(int i=0;i<n;i++)
		printf("%d ",f(a[i])+g(a[i]));
	printf("\n");
	return 0;
}

判断题

16.输入的n等于1001时,程序不会发生下标越界( )

17.输入的a[i]必须全为正整数,否则程序将陷入死循环( )

18.当输入为“5 2 11 9 16 10” 时,输出“3 4 3 17 5” ( )

19.当输入为“1 511998 ”时,输出为"18" ( )

20.将原码中g函数的定义(13 -16行) 移到main函数的后面,程序可以正常编译运行( )

单选题

21.当输入为"2 -65536 2147483647"时,输出为 ( )

A. "65532 33"

B. "65552 32"

C. "65535 34"

D. "65554 33"

#include<stdio.h>
#include<string.h>

char base[64];
char table[256];
char str[256];
char ans[256];

void init()
{
	for(int i=0;i<26;i++) base[i]='A'+i;
	for(int i=0;i<26;i++) base[26+i]='a'+i;
	for(int i=0;i<10;i++) base[52+i]='0'+i;
	base[62]='+',base[63]='/';
	
	for(int i=0;i<256;i++) table[i]=0xff;
	for(int i=0;i<64;i++) table[base[i]]=i;
	table['=']=0;
}

void decode(char *str)
{
	char *ret = ans;
	int i,len = strlen(str);
	for(i=0;i<len;i+=4){
		(*ret++) =table[str[i]]<<2|table[str[i+1]]>>4;
		if(str[i+2]!='=')
			(*ret++)=(table[str[i+1]]&0x0f)<<4|table[str[i+2]]>>2;
		if(str[i+3]!='=')
			(*ret++)=table[str[i+2]]<<6|table[str[i+3]];
	}
}

int main()
{
	init();
	printf("%d\n",(int)table[0]);
	
	scanf("%s",str);
	decode(str);
	printf("%s\n",ans);
	return 0;	
}

判断题

22.输出的第二行一定是由小写字母、大写字母、数字和"+"、"/"、"="构成的字符串( )

23.可能存在输入不同,但输出的第二行相同的情形( )

24.输出的第一行为"-1" ( )

单选题

25.设输入字符串长度为n,decode函数的时间复杂度为( )

A. O(\(\sqrt{n}\))

B. O(n)

C. O(n log n)

D. O(\(n^2\))

26.当输入为"Y3NX"时,输出的第二行为( )

A. "csp"

B. "csq"

C. "CSP"

D. "Csp"

27.(3.5分)当输入为"Y2NmIDIwMjE"时,输出的第二行为( )

A. "ccf2021"

B. "ccf2022"

C. "ccf 2021"

D. "ccf 2022"

#include<stdio.h>

#define n 100000
#define N n+1

int m;
int a[N],b[N],c[N],d[N];
int f[N],g[N];

void init()
{
	f[1]=g[1]=1;
	for(int i=2;i<=n;i++){
		if(!a[i]){
			b[m++]=i;
			c[i]=1,f[i]=2;
			d[i]=1,g[i]=i+1;
		}
		for(int j=0;j<m&&b[j]*i<=n;j++){
			int k=b[j];
			a[i*k]=1;
			if(i%k==0){
				c[i*k]=c[i]+1;
				f[i*k]=f[i]/c[i*k]*(c[i*k]+1);
				d[i*k]=d[i];
				g[i*k]=g[i]*k+d[i];
				break;
			}
			else{
				c[i*k]=1;
				f[i*k]=2*f[i];	
				d[i*k]=g[i];
				g[i*k]=g[i]*(k+1);
			}
		}
	}
}

int main()
{
	init();
	
	int x;
	scanf("%d",&x);
	printf("%d %d\n",f[x],g[x]);
	return 0;
}

假设输入的x是不超过1000的自然数,完成下面的判断题和单选题

判断题

28.若输入不为"1",把第12删去不会影响输出的结果( )

29.(2分) 第24行的"f[i]/c[i*k]"可能存在的无法整除而向下取取整的情况( )

30.(2分)在执行完init()后,f数组不是单调递增的,但g数组是单调递增的( )

单选题

31.init 函数的时间复杂度为( )

A. O(n)

B. O(nlogn)

C. O(n \(\sqrt{n}\))

D. O(\(n^2\))

32.在执行完init()后,f[1],f[2],f[3]...... f[100]中有( )个等于2.

A. 23

B. 24

C. 25

D. 26

33.(4分)当输入为"1000"时,输出为( )

A. "15 1340"

B. "15 2340"

C. "16 2340"

D. "16 1340"

三、 完善程序 (单选题 ,每小题3分,共30分)

1(Josephus问题)有n个人围成一个圈,依次标号0至n-1。从0号开始,依次 0,1,0,1...交替报数,报到1的人会离开,直至只剩下一个人。求最后剩下人的编号

试补全模拟程序

#include<stdio.h>

const int MAXN=1000000;
int F[MAXN];

int main(){
	int n;
	scanf("%d",&n);
	int i=0,p=0,c=0;
	while(①){
		if(F[i]==0){
			if(②){
				f[i]=1;
				③;
			}
			④
		}
		⑤;
	}
	int ans=-1;
	for(i=0;i<n;i++)
		if(F[i]==0)
			ans=i;
	printf("%d\n",ans);
	return 0; 
} 

34.①处应填( )

A. i<n

B. c<n

C. i<n-1

D. c<n-1

35.②处应该填( )

A. i%2==0

B. i%2==1

C. p

D. !p

36.③处应该填( )

A. i++

B. i=(i+1)%n

C. c++

D. p^=1

37.④处应该填( )

A. i++

B. i=(i+1)%n

C. c++

D. p^=1

38.⑤处应该填( )

A. i++

B. i=(i+1)%n

C. c++

D. p^=1

2.(矩形计数)平面上有n个关键点,求有多少个四条边都和x轴或者y轴平行的矩形,满足四个顶点都是关键点。给出的关键点可能有重复,但完全重合的矩形只计一次。

试补全枚举算法

#include<stdio.h>

struct point{
	int x,y,id;
};

int equals(struct point a,struct point b){
	return a.x==b.x && a.y==b.y;
}

int cmp(struct point a,struct point b){
	return ①;
}

void sort(struct point A[],int n){
	for(int i=0;i<n;i++)
		for(int j=1;j<n;j++)
			if(cmp(A[j,a[j-1]])){
				struct point t=A[j];
				A[j]=A[j-1];
				A[j-1]=t; 
			}
}

int unique(struct point A[],int n){
	int t=0;
	for(int i=0;i<n;i++)
		if(②)
			A[t++]=A[i];
	return 0;
}

int binary_search(struct point A[],int n,int x,int y){
	struct point p;
	p.x=x;
	p.y=y;
	p.id=n;
	int a=0,b=n-1;
	while(a<b){
		int mid=③;
		if(④)
			a=mid+1;
		else
			b=mid;
	}
	return equals(A[a],p);
}

#define MAXN 1000
struct point A[MAXN];

int main(){
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d %d",&A[i].x,&A[i].y);
		A[i].id=i;
	}
	sort(A,n);
	n=unique(A,n);
	int ans = 0;
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			if( ⑤ && binary_search(A,n,A[i].x,A[j].y) && binary_search(A,n,A[j].x,A[i].y)){
				ans++;
			}
	printf("%d\n",ans);
	return 0;
}

39.①处应填( )

A. a.x!=b.x?a.x<b.x:a.id<b.id

B. a.x!=b.x?a.x<b.x:a.y<b.y

C. equals(a,b)?a.id<b.id:a.x<b.x

D. equals(a,b)?a.id<b.id:(a.x!=b.x?a.x<b.x:a.y<b.y)

40.②处应该填( )

A. i==0||cmp(A[i],A[i-1])

B. t==0||equals(A[i],A[t-1])

C. i==0||!cmp(A[i],A[i-1])

D. t==0||!equals(A[i],A[t-1])

41.③处应该填( )

A. b-(b-a)/2+1

B. (a+b+1)>>1

C. (a+b)>>1

D. a+(b-a+1)/2

42.④处应该填( )

A. !cmp(A[mid],p)

B. cmp(A[mid],p)

C. cmp(p,A[mid])

D. !cmp(p,A[mid])

43.⑤处应该填( )

A. A[i].x==a[j].x

B. a[i].id<A[j].id

C. A[i].x==A[j].x && A[i].id<A[j].id

D. A[i].x<A[j]. && A[i].<A[j].y

posted @ 2021-09-21 23:54  new-code  阅读(2127)  评论(0编辑  收藏  举报