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

一、单选题(每题 2 分,共 30 分)
第 1 题 IPv4中,以下 IP地址不合法的是( )
第 2 题 已知A,B,C是3个二进制数,符号∨表示逻辑与运算,符号∧表示逻辑或运算。 若A=1100 1101 0011 B= 1100 0111 0110 C= 0011 0110 1010 则表达式(A∨B)∧(A∨C)的值为()
第 3 题 Linux下可执行文件的默认扩展名为( )
第 4 题 八进制数7042转化为十六进制数是( )
第 5 题 以下排序算法中,不需要进行关键字比较操作的算法是( )
第 6 题 一个袋子中有3个蓝球,2个红球,2个黄球,则从中抽出三个球颜色各不相同的概率是多 少?( )
第 7 题 定义L数:素数或者是回文数满足两者中任意一个条件的数。大于等于10并且小于等于120的“L数”共有多少个? (注:回文数指从左到右读与从右到左读是相同的,如“121”、“1331”;两个条件都成立也是L数,如“131”)( )
第 8 题 定义一颗有根树的深度:根结点的深度为0,其余结点的深度等于该结点的父亲结点的深度加1。以下数字中哪一个可 以作为一颗深度为9的完全二叉树的总节点数?( )
第 9 题 共9个互不相同的数,它们的最大公约数是2021的一个大于1的因子(6有2、3、6这三个大于1的因子,因子可以包含自身),且这9个数的和小于等于2021,则这9个数的和是多少?( )
第 10 题 以下哪位科学家被称为“博弈论之父”,“现代计算机之父”? ( )
第 11 题 设栈S和队列Q初始状态为空,元素a1,a2,...,a6依次通过栈S,一个元素出栈后就进 入队列Q,若出队的顺序分别是a2,a4, a3,a6,a5,a1,则栈S的容量至少是( )
第 12 题 对有序数组{5,13, 19,21,37,56,64,75,88,92,100}进行二分查找,等概率的情 况下在找成功的平均查找长度(平均比较次数)是( )
第 13 题 一个 n 个顶点的强连通图最少有几条边( )
第 14 题 在1和2015 之间(包括1和2015在内)不能被4、5、6三个数任意一个数整除的数有几个?( )
第 15 题 关干Catalan数 C,下列说法错误的是( )。
二、判断题(每题 2 分,共 20 分)
第 16 题
#include<bits/stdc++.h>
using namespace std;
int p;
void fun(int &x,int &y);
void func(int &x,int &y) {
	if(y>x)return;
	x--;y/=2;
	fun(x,y);
}
void fun(int &x,int &y) {
	if(x==1)return;
    x/=2;y+=p;
	func(x,y);
}
int main() {
	int x,y;
	cin>>x>>y>>p;
	fun(x,y);
	cout<<x<<' '<<y;
	return 0;
}
判断题
第 16 题 将第四行的&去除后,程序仍能通过编译。( )
第 17 题 读入的x,y,p为int范围内任意值时程序均能完成运行。( )
第 18 题 若x=1时,输出的x,y与输入的一致。()
第 19 题 输出的x必然小于等于输入的x。( )
第 20 题 输入为7 33 2时,输出为( )
第 21 题 输人为33 7 2时,输出为( )
第 23 题
#include <iostream>
using namespace std;
const int maxn= 105;
int n,a[maxn],b[maxn];
int main()
{
	cin >> n;
	int x;
	for (int i=1; i<=n; i++){
		cin>>x;
		a[i]=b[i]=x;
	}
	
	for (int i=1; i<=n; i++)
		for (int j=i+1; j<=n; j++){
			if (a[i]>a[j]) swap(a[i],a[j]);
			if (b[i]<b[j]) swap(b[i],b[j]);
		}

	for (int i=1; i<=n; i++) cout<<a[i]<<" ";
	cout<<"\n";
	for (int i=1; i<=n; i++) cout<<b[i]<<" ";
	cout<<"\n";
	return 0;
}
判断题
第 23 题 若输入的X[1],X[2],...,X[N]中有相同的数,程序会陷入死循环。()
第 24 题 当且仅当输入的X[1],X[2],…,X[N]全部相同时输出的两行结果相同。()
第 25 题 该算法的原理是基数排序。()
第 26 题 若输入的X[1],X[2],...,X[N]互不相同,则下列说法正确的是( )
第 27 题 下列说法不正确的是( )
第 28 题 该程序的时间复杂度为( )
第 30 题
#include<bits/stdc++.h>
using namespace std;
int main() {
	int num=0;
	cin>> num;
	//保证num>= 100,且在int范围内
	int max_primedivisor=0;
	int cnt=1;
	for (int i= 2; i*i<= num; i++) {
		if (num%i==0) {
			int tmp= 1;
			while (num%i==0) num/= i,tmp++;
			max_primedivisor = max(max_primedivisor,i);
			cnt*=tmp;
		}
	}
	max_primedivisor = max(max_primedivisor ,num);
	if (num>1) cnt *= 2;
	cout<< max_primedivisor<<" "<<cnt <<"\n" ;
	return 0;
}
判断题
第 30 题 代码中max_primedivisor = max(max_primedivisor ,num);这句话去掉对答案没有影响。()
第 31 题 当读入的num=p*q.其中p
第 32 题 该算法的最坏时间复杂度为()
第 33 题 当读入2021时输出为( )
第 34 题 当读入的数num=p*p*p*q*q*r*r*s*t时,其中p
第 35 题 在最好的情况下,时间复杂度为()
三、编程题(每题 25 分,共 50 分)
第 37 题 (电电鼠与方阵)有一个n*n (2<=n<=5000)的方阵,其中每个方格有一个电力值。小Y可以在这个方阵中得到电力,方法就是在一些方格放上电电鼠来吸收电力,这样就可以获得这些方格上的电力。不过放的电电鼠须要遵循两个规则:1.一个方格最多只能放一只电电鼠;2.所有2*2的子矩阵(共有(n-1)*(n- 1)个)必须恰好包含两只电电鼠。小Y用了一个程序求出了能获得的最大总电力值。 试补全程序。
#include<bits/stdc++.h>
using namespace std;
const int N=5100;
int a___(1)___;
int main() {
	int n,ans1=0,ans2=0;
	scanf("%d",&n);
	for (int i= 1; i<= n; i++)
		for (int j=1; j<= n; j++)
			scanf("%d",&a[i][j]);
	for (int i=1; i<=n; i++) {
		int odd=0,even=0;
		for (int j=1; j<=n; j++) {
			int x=___(2)___;
			if(j&1) odd += x;	else even += x;
		}
		ans1 + = max(odd, even);
	}
	for (int i=1; i <= n; i++) {
		int odd = 0, even = 0;
		for(int j=1; j<=n; j++) {
			int x=___(3)___;
			if(___(4)___) even+=x;	else odd += x;
		}
		ans2 += max(odd, even);
	}
	printf("%d\n",___(5)___);
	return 0;
}
第 37 题 ①处应填( )
第 38 题 ②处应填( )
第 39 题 ③处应填( )
第 40 题 ④处应填( )
第 41 题 ⑤处应填( )
第 43 题 (排列)给定一个1~n的排列A,你需要给出一个1~n的排列B,使得排列B的字典序的值最小。输出字典序最小的排列B。 输人两行,第一行一个正整数n. 第二行n个整数表示排列A. 提示:将问题分为n是奇数和n是偶数考虑,贪心处理。 试补全程序。
#include<bits/stdc++.h>
using namespace std;
int A[1000010];int B[1000010];int C[1000010];
int main() {
	int n;scanf("%d" ,&n);
	for(int i=1; i<= n; i++ )scanf("%d" ,&A[i]);
	
	if(___(1)___) {
		int p1=0;int p2=___(2)___;
		for(int i=1; i<=n; i++) {
			if(A[i]>n/2) {
				B[i]=++p1;
			} else {
				B[i]= ++p2;
			}
		}
	} else {
		int p1=0;int p2= n/2;
		for(int i=1; i<=n; i++) {
			if(A[i]>___(3)___) {
				B[i]=++p1;
			} else {
				B[i]=++p2;
			}
		}
		
		p1=0;p2=n/2+1;
		for(int i=1; i<=n; i++){
			if(A[i]>___(4)___) {
				C[i]=++p1;
			} else {
				C[i]= ++p2;
			}
		}
		
		int flag=0;
		for(int i=1; i<=n; i++) {
		if(B[i]<C[i]) {	flag=1;break;}
		if(B[i]>C[i]) {	flag=2;break;}
		}
		if(flag!=___(5)___)swap(B,C);
	}
	for(int i=1; i<n; i++) printf("%d ",B[i]);
	printf("%d\n" ,B[n]);
	return 0;
}
第 43 题 ①处应填( )
第 44 题 ②处应填( )
第 45 题 ③处应填( )
第 46 题 ④处应填( )
第 47 题 ⑤处应填( )