2022入门组 CSP-J 初赛模拟试题 (14)

一、单选题(每题 2 分,共 30 分)
第 1 题 下列数中最大的数为( )。
第 2 题 微型计算机的以下选规项中,( )的存取电度最快。
第 3 题 表达式(3+5)*25-34/(7-5)的后缀形式是( )。
第 4 题 定义一颗有根树的深度:根结点的深度为0,其余结点的深度等于该结点的父亲结点深度加1。一颗深度为9的完全二叉树至少包含( )个结点。
第 5 题 下列程序的时间复杂度是( )。
int m,n,s=0;
cin>>m>>n;
for (int i=0; i<=m; i++)
for (int j=1; j<=n; j*=2)
s++;
第 6 题 下列各排序法中,最坏情况下的时间复杂度最低的是( )。
第 7 题 已知二叉树的中序遍历为DEGHFCABI,后序遍历为HGFEDCIBA,则该二叉树的前序遍历为( )。
第 8 题 设栈S的初始状态为空,若干个元素{a,b,c,d,e,f}依次入栈S,出栈序列为{b,d,f,e,c,a},根据出栈的序列求栈S的最小容量为( )。
第 9 题 小明想开个造纸飞机的公司,于是雇了5个人。接着他要去购买原材料了,已知一包A1纸中有4张纸,一张A1纸能折7架飞机,每位员工要制造100架飞机。因为制造飞机需要一个相对安静的环境,所以员工之间不能互相借纸,也不能提前裁纸。但是老板小明可以把一似纸拆开分开员工,以确保分给每个员工的纸张数量是一样的,又尽可能的少用原材料。求小明至少要买( )包A1纸。
第 10 题 中国古化的历史故事“田忌赛马”是大家所熟知的。话说齐王和田忌又要赛马了,他们各派出10匹马,每场比赛,输的一方将要给赢的一方10两黄金,如果是平局的话,双方都不必拿出钱。现在每匹马的速度值是固定而且已知的,而齐王出马也不管田忌的出马顺序。请问田忌该如何安排自己的马去对抗齐王的马,才能赢取最多( )两黄金。第一行的10个整数表示田忌的马的速度。第二行的10个整数为齐王的马的速度。 田忌的马 100 95 40 85 80 75 70 65 60 55 齐王的马 98 97 92 88 85 81 55 50 44 40
第 11 题 设W=true, X=Y=false ,Z=true,以下逻辑运算表达式值为真的是( )。
第 12 题 非常经典的汉诺塔问题,目标是将A柱上的盘子移到C柱上,但是大的盘子不能放到小的盘子上面。现在规定:A柱上的盘子只能移到B柱,B只能移到C,C只能移到A。现在A柱上有3个盘子,要把这些盘子按照上述规则都挪到C柱上,每次移动一个盘子,至少要移动( )次。
第 13 题 有5本不同的书放在书架上。现重新摆放,使每本书都不在原来放的位置。有( )种摆法。
第 14 题 字符串“zhangnahz”,本质不同的子串个数为( )。
第 15 题 一棵无向树T有7片树叶,3个3度顶点,其余顶点均为4度,则T有( )个4度结点。
二、判断题(每题 2 分,共 20 分)
第 16 题
#include<iostream>
using namespace std;
int main() {
	int a,b;
	scanf ("%d%d", &a, &b) ;
	int anx=1;
	while (b) {
		if (b&1) anx=anx*a;
		a=a*a;
		b>>=1 ;
	}
	printf ("%d\n",anx) ;
}
判断题
第 16 题 输入a=10,b=10,能够正确输出答案。( )
第 17 题 第06行的anx=1,改成anx=0不会影响最终结果。()
第 18 题 将第08行与第09行交换位置,不会影响最终结果。( )。。
第 19 题 将第10行改成b/=2,不会影响最终结果。()
第 20 题 如果输入a=2,下列哪个数字最可能为该程序输出的结果( )。
第 21 题 输入a=9,b=9,输出结果为( )。
第 23 题
#include<bits/stdc++.h>
using namespace std;
struct num {int a,b;};
void fun(struct num s[], int n) {
	int index,j,k;
	struct num temp;
	for(k=0; k<n-1; k++) {
		index = k;
		for(j=k+1; j<n; j++)
			if(s[j].b<s[index].b) index=j;
		if(index!=k) {
			temp=s[index];
			s[index]=s[k];
			s[k]=temp;
		}
	}
}
int main() {
	int count,i,k,m,n,no;
	struct num s[100];
	cin>>n>>m>>k;
	for(i=0; i<n; i++) {
		s[i].a=i+1;
		s[i].b=0;
	}
	i=0;
	count=no=0;
	while(no<n) {
		if(s[i].b==0)
			count++;
		if (count==m) {
			no++;
			s[i].b=no;
			count=0;
		}
		i++;
		if(i==n)
			i=0;
		}
	fun(s,n);
	printf ("%d:%d\n",s[k-1].b,s[k-1].a);
	return 0;
}
判断题
第 23 题 若输入为:0 0 0时,程序运行会出错。( )
第 24 题 若输入为:1 2 3时,则输出为3:1。( )
第 25 题 若把11行的“index!=k”改为1,不会影响程序运行结果。( )
第 26 题 若去掉37和38行,不会影响程序运行结果。( )
第 27 题 程序运行时,输入5 4 3 ,输出( )。
第 28 题 程序运行时,输入7 5 2,输出( )。
第 30 题
#include<iostream>
using namespace std;
long long a[100010],b[100010], ans;
void mmm(int L,int R)
{
	if(L==R) return;
	int mid=(L+R)>>1;
	mmm(L,mid);
	mmm(mid+1,R);
	int i=L,j=mid+1,k=L;
	while(i<=mid && j<=R)
	{
		if(a[i]>a[j])
		{
			ans+=j-k;
			b[k++]=a[j++];
		}
		else
			b[k++]=a[i++];
	}
	while(i<=mid) b[k++]=a[i++];
	while(j<=R) b[k++]=a[j++];
	for(i=L; i<=R; i++) a[i]=b[i];
}
int main()
{
	int i,n;
	cin>>n;
	for(i=1; i<=n; i++)
		cin>>a[i];
	mmm(1,n) ;
	cout<<ans;
}
判断题
第 30 题 去掉第06行,程序运行结果相同。( )
第 31 题 第21行与第22行交换一下,程序运行结果相同。()
第 32 题 第07行改为int mid=(L+R)/2,程序运行结果相同。( )
第 33 题 该算法的原理是归并排序。( )
第 34 题 该程序的时间复杂度为( )。
第 35 题 程序输入4 3 2 3 2,则输出为( )。
第 36 题 (4分)程序输入4 6 5 2 4,则执行到32行时,数组a[ ]的数据为( )。
三、编程题(每题 25 分,共 50 分)
第 38 题 第一行输入一个正整数n,第二行输入n个整数,判断这些数是否构成等比数列。 试补全程序。
#include <bits/stdc++.h>
using namespace std;
int main()
{
	int cur,q,i,n,pre;
	cin>>n;
	__(1)__;
	__(2)__;
	pre=cur;
	for(i=3; i<=n; i++) {
		cin>>cur;
		if(__(3)__)
			break;
		q=cur/pre;
		__(4)__;
	}
	if(__(5)__)
		printf ("Yes\n");
	else
		printf ("No\n");
}
第 38 题 ⑴处应填( )。
第 39 题 ⑵处应填( )。
第 40 题 ⑶处应填( )。
第 41 题 ⑷处应填( )。
第 42 题 ⑸处应填( )。
第 44 题 (次大值之和)给定一个1到n的数字各出现一次的排列a[1]、a[2]、...、a[n],定义f(l,r) 表示a[l]、a[l+1]、a[l+2]、...、a[r]中的次大值,你需要求出对于所有的1<=i#include <bits/stdc++.h> #define LL long long using namespace std ; const int MAXN=100005; struct T { int v,id;//v存放读入元素值,id存放读入顺序号门 } x[MAXN]; int pre[MAXN], nxt[MAXN]; ; int cmp(T t1,T t2) {return t1.v<t2.v;} void del(int p) { int L=pre[p],r=nxt[p]; nxt[L]=r;pre[r]=L; } int main() { int m,n,t,i,j,k; scanf("%d",&n); for(i=1; i<=n; i++) { scanf ("%d",&x[i].v); x[i].id=__(1)__; pre[i]=i-1; nxt[i]=i+1; } nxt[0]=1; pre[n+1]=n; __(2)__; LL ans=0; for(i=1; i<=n; i++) { LL L1,L2,r1,r2; L1=pre[x[i].id]; if(L1) L2=pre[L1]; else L2--; r1=nxt[x[1].id]; if(r1!=n+1) r2=nxt[r1]; else r2=-1; if(L2 !=-1) ans+=__(3)__; if(r2 !=-1) ans+=__(4)__; del(__(5)__); } printf("%lld",ans); }
第 44 题 ⑴处应填( )。
第 45 题 ⑵处应填( )。
第 46 题 ⑶处应填( )。
第 47 题 ⑷处应填( )。
第 48 题 ⑸处应填( )。