2021入门组 CSP-J 初赛模拟试题 (2)

一、单选题(每题 2 分,共 30 分)
第 1 题 以下哪些不是属于国家顶级域名的是()
第 2 题 2个10进制数1111和1010的异或运算结果的10进制表示是()
第 3 题 8位二进制数中去掉符号位,最大能表示多少字符()
第 4 题 在写递归函数时,哪些定义一般不写在递归函数中()
第 5 题 一棵完全二叉树,共有1234个节点,其叶子结点的个数为()
第 6 题 某公司派赵钱孙李周五人出国学习,选派条件是: a.若赵去,钱也去; b.李、周两人必有一人去 c.如周去,则赵、钱也同去; d.孙、李二人同去或同不去 如何选他们出国?( )
第 7 题 已知一棵二叉树前序遍历为ABCDEFGI,后序遍历为CEDBIGFA,则其中序遍历可能为()
第 8 题 8颗子弹,编号为1、2、3、4、5、6、7、8,从编号1开始按序嵌入弹夹,以下有哪个不是正常的打出子弹的次序()
第 9 题 已知循环队列空间为30,队头位置编号为12,队尾元素下一个空位置编号为5,则队伍中元素个数为()
第 10 题 甲箱中有200 个螺杆,其中有160 个A型螺杆:乙箱中有240 个螺母,其中有180个A型的。现从甲乙两箱中各任取一个,则能配成A型螺栓的概率为多少?()
第 11 题 今年信息学进复赛的同学有6人,老师将他们排成一圈分发奖品,请问有几种排法()
第 12 题 设二维数组A的行下标为0至5,列下标为1至5,F的每个数据元素均占2个字节。在按行存贮的情况下,已知数据元素A[3][3]的第一个字节是2019,则A[4][4]的第一个字节的地址为()
第 13 题 在右图中,有() 个顶点出发存在一条路径可以遍历图中得每条边,而且仅遍历一次。
第 14 题 有A、B、C、D、E、F六个绝顶聪明又势均力敌的盗墓贼,他们都排着队,他们每个人都想独吞财宝,最前面的A如果拿了财宝,那么体力下降,则其后面的B会杀掉A,拿了财宝,当然B拿了财宝,体力也会下降,一样会被C杀掉,如果B不拿财宝,则C无法杀B,请问A、C、E的最终想法是()
第 15 题 以下哪个不属于应用层的()
二、判断题(每题 2 分,共 20 分)
第 16 题
#include<bits/stdc++.h>
using namespace std;
int main() {
	string s;
	char s1[100];
	int len,j=0;
	cin>>s;
	len=s.size();
	memset(s1,0,sizeof(s1));
	for(int i=0; i<len; i++) {
		if(i%2==0)
			if((s[i]>='A' && s[i]<'z') || (s[i]>='a' && s[i]<'z')) {
				s1[j]=s[i]+1;
				++j;
			}
	}
	cout<<s1<<endl;
	return 0;
}
判断题
第 16 题 输出的字符串只能是字母组成。 ()
第 17 题 将12行的<改为<=则输出结果有可能包含数。()
第 18 题 将第9行删除,程序运行结果不会改。()
第 19 题 将11行删除,输出字符的长度和输入字符的长度一致。 ()
第 20 题 如输入的字符串长度为10,则输出的字符串长度最长可能为多少()
第 21 题 如输入的字符串都是字母,则输出中哪个字母可能出现()
第 23 题
#include<bits/stdc++.h>
using namespace std;
int main() {
	int a[1001],i,j,t,n;
	for(i=0; i<=1000; i++)
		a[i]=0;
	scanf("%d",&n);
	for(i=1; i<=n; i++) {
		scanf("%d" ,&t);
		a[t]++;
	}
	for(i=1000; i>=0; i--)
		for(j=1; j<=a[i]; j++)
			printf("%d ",i);
	return 0;
}
判断题
第 23 题 输入10个数字,输出结果是从小到大。()
第 24 题 (2分)输入的数字中有2个1,则输出时出来第一个1是第一个输入。()
第 25 题 (2分)第13行的<=改为<号,且输入数据为10 2 12 33 34 1 28 7 22 9 0,则无输出。 ()
第 26 题 第12行改为for(i=0; i<=1000;i++)则程序运行结果不变。
第 27 题 第12行改为for(i=1000;i>1;i--):第13行改为for(j=a[i]; j>1; j--)输入数据为5 21 23 3 34 44,则运行结果( )
第 28 题 (4分)第10行改为++a[t]或a[t++],则输入5 1 2 3 4 5,输出结果为( )
第 30 题
#include<bits/stdc++.h>
using namespace std;
const int maxn=500000, INF=0x3f3f3f3f;
int L[maxn/2+2], R[maxn/2+2];
void unknown(int a[],int n,int left,int mid,int right) {
	int n1=mid-left , n2=right-mid;
	for(int i=0; i<n1; i++)
		L[i]=a[left+1];
	for(int i=0; i<n2; i++)
		R[i]=a[mid+i];
	L[n1]=R[n2]=INF;
	int i=0,j=0;
	for(int k=left; k<right; k++) {
		if(L[i]<=R[j])
			a[k]=L[i++];
		else
			a[k]=R[j++];
	}
}
void unknownsort(int a[],int n, int left,int right) {
	if(left+1<right) {
		int mid=(left+right)/2;
		unknownsort(a,n,left ,mid);
		unknownsort(a,n, mid,right);
		unknown(a,n,left , mid, right);
	}
}
int main() {
	int a[maxn],n;
	cin>>n;
	for(int i=0; i<n; i++)	cin>>a[i];
	unknownsort(a,n,0,n);
	for(int i=0; i<n; i++) {
		if(i) cout<<" ";
		cout<<a[i];
	}
	cout<<endl;
	return 0;
}
判断题
第 30 题 第13行的<改为<=将不会改变运行结果。
第 31 题 第21行的<改为<=将不会改变运行结果。
第 32 题 此类排序方法是高效的但是不稳定。
第 33 题 第4行的2个“+2”都去掉将不会改变运行结果。
第 34 题 此题是哪种排序()
第 35 题 此题用到了()思想
三、编程题(每题 25 分,共 50 分)
第 37 题 田忌赛马,田忌每赢一次齐王的马就得200金币,当然输了就扣200金币,平局则金币数不变。
#include<bits/stdc++.h>
using namespace std;
int main() {
	int n;
	while(cin>>n&&n!=0) {
		int tj[1001], king[1001], count=0;
		int tj_min=0, tj_max=n-1;
		int king_min=0,king_max=n-1;
		for(int i=0; i<n; i++) cin>>tj[i];
		for(int i=0; i<n; i++) cin>>king[i];
		sort(tj,tj+n);
		sort(king, king+n);
		while(n--) {
			if(tj[___(1)___]>king[___(2)___]) {
				count++;
				tj_max--;
				king_max--;
			}
			else if(tj[___(3)___]<king[___(4)___]) {
				count--;
				tj_min++;
				king_max--;
			}
			else
			{
				if(tj[tj_min]>king[king_min]) {
					count++;
					___(5)___;
					___(6)___;
				}
				else{
				if(___(7)___)
					count--;
				tj_min++;
				___(8)___;
				}
			}
		}
		cout<<count*200<<endl;
	}
	return 0;
}
第 37 题 (1)和(2)处填()
第 38 题 (3)和(4)处填()
第 39 题 (5)和(6)处填()
第 40 题 (7) 处填()
第 41 题 (8) 处填()
第 43 题 寻路问题: N*N 矩阵,其中0是表示可以走的,1表示无法走,矩阵有二维数组表示,走上角是 入口,右下角是出口,只能横着走和竖着走,要求找出最短路径
#include<bits/stdc++.h>
using namespace std;
int mymax=10000;
int f[4][2]= {{-1,0},{1,0},{0,-1},{0,1}};
int a[20][20],v[20][20],v1[20][20];
int l=1;
int n;//矩阵的规模
bool check(int x1,int y1) {
	if(x1<0||x1>=n ||___(1)___ )return false;
	if(a[x1][y1]==1||___(2)___ )return false;
	return true;
}
void dfs(int x,int y) {
	if(x==n-1&&y==n-1) {
		if(l<mymax) {
			mymax=l ;
			memcpy(v1,v,sizeof(v1));
		}
		return ;
	}
	for(int k=0; k<4; k++) {
		int x1,y1;
		x1=x+___(3)___ ;
		y1=y+___(4)___ ;
		if(check(x1,y1)) {
			___(5)___ ;
			___(6)___ ;
			dfs(x1,y1);
			___(7)___ ;
			v[x1][y1]=0;
		}
	}
}
int main() {
	cin>>n;
	for(int i=0; i<n; i++) {
		for(int j=0; j<n; j++)
			cin>>a[i][j];
	}
	dfs(0, 0);
	int d=v1[n-1][n-1];
	int x=n-1,y=n-1;
	int k;
	int qn[400][2];
	qn[0][0]=n-1;
	qn[0][1]=n-1;
	for(k=1;; k++) {
		x=x-f[d][0];
		y=y-f[d][1];
		qn[k][0]=x;
		qn[k][1]=y;
		d=v1[x][y];
		if(x==0&&y==0)break;
	}
	for(int i=k; i>=0; 1--)
		cout<<___(8)___ <<", "<<___(9)___ <<endl;
	return 0;
}
第 43 题 (1)和(2)处填()
第 44 题 (3)和(4)处填()
第 45 题 (5)处填()
第 46 题 (6)和(7)处填()
第 47 题 (8)和(9)处填()