#A. CSP-J 初赛模拟赛6

    Type: Objective

CSP-J 初赛模拟赛6

You cannot submit for this problem because the contest is ended. You can click "Open in Problem Set" to view this problem in normal mode.

一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项)

  1. 2024 的因子与质因子分别有( )个。 {{ select(1) }}
  • A.18和3
  • B.16和3
  • C.15和3
  • D.16和4
  1. 使用邻接矩阵表示N个结点的有向图,所需要的存储空间为( )。 {{ select(2) }}
  • A. N×(N+1)N \times (N+1)
  • B. N2N^2
  • C. N×(N1)N \times (N-1)
  • D. N×(N1) /2 N \times (N-1) \ /2 \
  1. 在C++程序中,表达式a%=b与下列哪个表达式是等价的?() {{ select(3) }}
  • A. a=%b
  • B. a/=b
  • C. a=b%a
  • D. a=a%b
  1. 线性表若采用链表存储结构,则要求内存中可用存储单元地址( )。{{ select(4) }}
  • A. 必须连续
  • B. 必须不连续
  • C. 连续或不连续都行
  • D. 部分连续
  1. 我们输入一个新闻网站的网址便可访问该网站,其中用到的网络协议是( ) {{ select(5) }}
  • A. DNS
  • B. FTP
  • C. SSH
  • D. TELNET
  1. 以下哪个不属于STL中栈的操作函数?( ) {{ select(6) }}
  • A. empty
  • B. front
  • C. push
  • D. pop
  1. 平面上任取 nn 个整点(横坐标和纵坐标都是整数),其中一定存在两个点,它们的中 点也是整点,那么 nn 至少是( )。 {{ select(7) }}
  • A. 4
  • B. 5
  • C. 6
  • D. 7
  1. 以下哪个操作属于位运算范畴?( ) {{ select(8) }}
  • A. &&
  • B. ||
  • C. >>>
  • D. ^

9.关于树这种数据结构,下面的说法中哪个是正确的?( ) {{ select(9) }}

  • A. 满二叉树的结点总数一定是奇数
  • B. 完全二叉树的结点总数一定是奇数
  • C. 树形结构只有双亲表示法和孩子表示法
  • D. 二叉树的遍历方法只有前序遍历法和后序遍历法
  1. 以下哪个选项不属于头文件cmath?() {{ select(10) }}
  • A. find(iterator first, iterator last, int x)
  • B. abs(int x)
  • C. ceil(double x)
  • D. pow(double x,double y)

11.在C++语言中,表达式5&4|3的值等于( )。 {{ select(11) }}

  • A. 7
  • B. 5
  • C. 4
  • D. 3

12.定义变量double n,如果下面的代码输入为1000,则输出最接近( )

#include<bits/stdc++.h>
using namespace std;
int main()
{
	double n;
    cin>>n;
    cout << log10(n)-log2(n)<< endl;
    return 0;
}

{{ select(12) }}

  • A. 0
  • B. -5
  • C. -7
  • D. 7
  1. 在图的广度优先搜索中,要维护一个标识数组表示已经访问过的图的结点,需要()数据结构存放结点以实现遍历。 {{ select(13) }}
  • A. 栈
  • B. 队列
  • C. 哈希表
  • D. 堆
  1. 从一个 6×66 \times 6 的棋盘(不可旋转)中选取不在同一行也不在同一列的两个方格,共有( )种方法。 {{ select(14) }}
  • A. 480
  • B. 450
  • C. 360
  • D. 720
  1. 下列关于集合的说法哪个不正确?() {{ select(15) }}
  • A. 一个元素是否属于一个集合是确定的
  • B. 集合中的元素两两不同
  • C. 0属于空集
  • D. 集合中的元素不存在先后次序

二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填V,错误填×除特殊说明外,判断题每题1.5分,选择题每题3分,共计40分)

(1)

#include <bits/stdc++.h>
using namespace std;
int main()
{
	set <int> s;
	srand(time(0));	//第6行
	int n=6;
	int l=12;		//第8行
	int k,i=0,a[n];
	while(s.size()<n)	//第10行
	{
		k=rand()%10+1;
		s.insert(k);	//第13行
	}
	set <int>::iterator it;
	for(it=s.begin(); it!=s.end(); it++)
		a[i++] = *it;
	for(int i=0; i<n; i++)
	{
		int x=rand()%n;	//第20行
		int y=rand()%n;	//第21行
		if(a[x] > aly])
			swap(alx],aly]);
	}
	for(int i=0; i<n; i++)
		cout<<ali]<<" ";
	return 0;
}

判断题

16.若去掉第6行,程序的输出结果不受任何影响 () {{ select(16) }}

  • true
  • false

17.若去掉第8行,程序的输出结果中的数字总数不变。 () {{ select(17) }}

  • true
  • false

18.程序的输出结果是一个从小到大排列的整数序列。 () {{ select(18) }}

  • true
  • false

19.将第10行中的s.size()替换成s.length(),程序的运行结果不会改变。() {{ select(19) }}

  • true
  • false

选择题

20.将第13行 s.insert(k) 替换成 for(int izl;ic=6;i++)s.insert(i) ,则输出为( )。 {{ select(20) }}

  • A. 1 2 3 4 5 6
  • B. 6 5 4 3 2 1
  • C. 1 2 3 6 5 4
  • D. 1-6随机分布值

21、将第 13 行 s.insert(k) 替换成 for(int i=l;icn7;i++) s.insert(i),第20 行替换为 int x=i+1 ,第 21 行替换为 int y=i,则输出为( )。 {{ select(21) }}

  • A. 1 2 3 4 5 6
  • B. 6 5 4 3 2 1
  • C. 2 3 4 5 6 7 1
  • D. 2 3 4 5 6 7

(2)

#includecbits/stdc++,h>
using namespace std;
int month[13]={-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};	//第3行
int date,ans1,ans2,y,m,d;
bool check1(int date)
{
	char s[32];
	sprintf(s, "%d", date);
	if(s[0]==s[7] && s[1]==s[6] && s[2]==s[5] && s[3]==s[4])
		return true;
	return false;
}
bool check2(int date)
{
	char s[32];
	sprintf(s,"%d",date);
	if(s[0]==s[2] && s[0]==s[5] && s[0]==s[7] && s[1]==s[3] && s[1]==s[4] && s[1]==s[6])	//第15行
		return true;
	return false;
}
int main()
{
	cin>>date;
	y=date/10000;
	m=date/100%100;	//第23行
	d=date%100;
	for(int i=y; ; i++){
		if(i%400==0 || (i%100!=0 && i%4==0))
			month[2]= 29;
		else
			month[2]= 28;
	int j=(i==y)?m:1;	//第30行
	for(;j<=12;j++) 
	{
		int k=(i==y && j==m)?d+1:1;
		for(;k<=month[j];k++){
			int date=i*10000+j*100+k;
		if(check1(date) && ans1==0)
			ans1=date;
		if(check2(date))
			return cout<<ans1<<""<<date << endl,0;
		}
	}
	return 0;
}

注:输入为8位数字。

判断题

22.将第3行中的-1改为0,程序的运行不受任何影响。 () {{ select(22) }}

  • true
  • false
  1. 去掉第15行中的` && s[1]==s[4] && s[1]==s[6]``,程序的输出不变。() {{ select(23) }}
  • true
  • false

24.将第23 行 m=date/100%100 替换为 m=date%10000/100,程序的输出不变。( ) {{ select(24) }}

  • true
  • false

25.将第30行改为int j;if(i==y && j==1 || i!=y && j==0) j=m,程序的输出不变。 ( ) {{ select(25) }}

  • true
  • false

选择题

  1. 若输入 20240204,则输出为( ){{ select(26) }}
  • A. 20240204 20300302
  • B. 20300302 20400402
  • C. 20400402 21211212
  • D. 20300302 21211212

27.若输出 20011002 20200202 ,则输入可能为( ) {{ select(27) }}

  • A. 20011002
  • B. 20001001
  • C. 20020101
  • D. 20020202

(2)

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 100;
bool Prime_Number_Judge(const int &num)
{
	if (num <= 3)
		return num > 1;
	for (int i = 2; i < num; i++)
		if (num % i == 0)
			return false;
	return true;
}

int& Get_Number_Size(const int &num)
{
	int digit = 0, val = num;
	while (val){
		val /= 10;
		digit++;
	}
	return digit;
}

vectorc<int>&Get_Digits(const int &num, vectorcint> &digits){
	int vactor_val = 0;
	for(int num_size=Get_Number_Size(num);num_size>0;num_size--){
		vactor_val = num %(int)pow(10.0, num_size);
		vactor_val = vactor_val/(int)pow(10.0,num_size-1);
		digits.push_back(vactor_val);
	}
	return digits;
}
vectorc<int>&Get_K_Adjacent(const int &num, vector<int> &adjacent){
	vectork<int> digists_number;
	char tmp[128], buf_tmp[128];
	Get_Digits(num,digists_number);
	int digits = Get_Number_Size(num);
	for (int i = 0; i< digits; i++){
		for (int j = 0; j<digits-i; j++)[
			string buf;
		int k = 0;
		while (k <= i){
			sprintf(tmp,"%d",digists_number.at(j+k));
			buf += tmp;
			k++;
		}
		for(int i=0;i<=buf.size();i++)
			buf_tmp[i]= buf[i];
		adjacent.push_back(atoi(buf_tmp));
	}
	return adjacent;
}
int main()
{
	int count=0;
	for (int i= 1; i < MAXN; i++){
		if (Prime_Number_Judge(i))
		{
			vectorcint> buf;
			Get_K_Adjacent(i, buf);
			int sign = 1;
			for (int j =0; j < buf.size();j++)
				if(!Prime_Number_Judge(buf.at(j)))
					sign = 0;break;
			if (sign)
				count++;
		}
	}
	cout<<count;
	return 0;
}
判断题

28.若将第5行if(num<=3)替换为if(num<3),程序的运行结果不会改变。() {{ select(28) }}

  • true
  • false

29.若将第7行中的i<num替换为i*i<=num,程序的运行结果不会改变。( ) {{ select(29) }}

  • true
  • false

30.本程序用到的vector属于STL。 ( ) {{ select(30) }}

  • true
  • false

31.若将MAXN=100替换为MAXN=70,程序的运行结果不会改变。 (){{ select(31) }}

  • true
  • false

选择题

32.运行本程序,输出结果为( )。 {{ select(32) }}

  • A.7
  • B.8
  • C.9
  • D.10

33.若将MAXN=100改为MAXN=2024,程序的输出结果为( )。 {{ select(33) }}

  • A.9
  • B.10
  • C.11
  • D.12

34.(4分)若将MAXN=100改为MAXN=20244202,程序的输出结果为( )。 {{ select(34) }}

  • A.11
  • B.10
  • C.9
  • D.大于11的整数

三、完善程序(单选题,每小题3分,共计30分) (1)在图像编码的算法中,需要对一个给定的方形矩阵进行 ZZ 字形扫描。给定一个 n×nn \times n 的矩阵,ZZ字形扫描的过程如下图所示。

image-20240817110640677

4×44 \times 4的矩阵

1 5 3 9
3 7 5 6
9 4 6 4
7 3 1 3

进行Z字形扫描后得到长度为16的序列:

1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3

请实现一个Z字形扫描的程序。给定一个 n×nn \times n 的矩阵,输出对这个矩阵进行Z字形扫描的结果。

输入格式:

输入的第1行包含一个整数n,表示矩阵的大小。输入的第2行到第n+1行每行包含n个正整数,由空格分隔,表示给定的矩阵。

输出格式:

输出一行,包含 n×nn \times n个整数,由空格分隔,表示输入的矩阵经过Z字形扫描后的结果。

输入样例:

4
1 5 3 9
3 7 5 6
9 4 6 4
7 3 1 3

输出样例:

1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3

评测用例规模与约定:

1n5001 \le n \le 500,矩阵元素为不超过 10001000 的正整数。

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,t,×,y;
	t=1, x=1, y=1;
	int v[505][505],p[505][505];
	cin >> n;
	for(int i=1;i<=n;i++)
		for(int j=l;j<=n;j++)
			cin>>p[i][j];
	printf("%d",①);
	②;
	while(③)
	{
		if(y+1 <= n)
		{
			++t;
			y++;
			v[x][y]=1;
			printf("%d",p[x][y]);
		}
	}
	while(x+1<=n && y-1>=1 && ④)
	{
		++t;
		v[x+1][y-1]=1;
		printf("%d",p[x+1][y-1]);
		X++;
		y--;
	}
	if(x+1<=n)
	{
		++t;
		x++;
		v[x][y]= 1;
		printf("%d",p[x][y]);
	}
	while(x-1 >= 1 && y+1 <= n && !v[x-1][y+1])
	{
		++t;
		⑤;
		printf("%d",p[x-1][y+1]);
		x--;
		y++;
	}
	return 0;
}

35.①处应填( ) {{ select(35) }}

  • A. p[0][0]
  • B. p[0][1]
  • C. p[1][0]
  • D. p[1][1]

36.②处应填() {{ select(36) }}

  • A. v[0][0]=1
  • B. v[1][1]=1
  • C. v[0][1]=1
  • D. v[1][0]=1

37.③处应填( )。 {{ select(37) }}

  • A. t< n*n
  • B. t <= n*n
  • C. t < n
  • D. t<= n

38.④处应填( )。 {{ select(38) }}

  • A. v[x+1][y-1]
  • B. v[x-1][y+1]
  • C. !v[x+1][y-1]
  • D. !v[x-1][y+1]

39.⑤处应填( )。 {{ select(39) }}

  • A. v[x-1][y-1]= 1
  • B. v[x+1][y+1]= 1
  • C. v[x+1][y-1]= 1
  • D. v[x-1][y+1]=1

(2)你有一架天平和N个砝码,这N个砝码的重量依次是W、W.··Ww。请计算:一 共可以称出多少种不同的重量?注意砝码可以放在天平两边。 输入格式: 输入的第1行包含一个整数N。第2行包含个整数:W,W2.…,Ww。输出格式: 输出一个整数代表答案。

输入样例:

3
146

输出样例:

10

样例说明:

能称出的10种重量是1、2、3、4、5、6、7、9、10、11。

1=1 2=6-4(天平一边放6,另一边放4) 3=4-1 4=4 5=6-1 6=6 7=1+6 9-4+6-1 10-4+6 11=1+4+6

评测用例规模与约定:

对于50%的评测用例,1N151 \le N \le 15

对于所有评测用例,1N1001 \le N \le 100,N个砝码的总重量不超过 10510^5

#include <bits/stdc++.h>
using namespace std;
const int maxn = 105, maxv = 1e5 + 5;
int n, a[maxn], f[maxn][maxv], sum, ans;
int main()
{
	cin >> n;
	for(int i=1; i<= n; i++)
	{
		cin >> a[i];
		①;
	}
	
	f[0][0]=1;
	for(int i= 1; i <= n; i++)
		for(int ②;j >= 0;j--)//2
		{
			f[i][j] |= f[i-1][j];
			f[i][j] |=③;
			if(4)
				f[i][j] |= f[i-1][j] + a[i]];
		}
	
	for(int i=1; i <= sum;i++)
		⑤;
	cout << ans;
	
	return 0;	
}

40.①处应填() {{ select(40) }}

  • A. sum += a[i]
  • B. sum += a[1]
  • C. sum += a[n]
  • D. sum= a[i]

41.②处应填( )。 {{ select(41) }}

  • A. j=f[i][j]
  • B. j=sum-1
  • C. j=n
  • D. j=sum

42 ③处应填( ){{ select(42) }}

  • A.f[i-1][j-a[i]]
  • B.f[1-1][abs(j-a[i])]
  • C.f[i]][abs(j-a[i])]
  • D.f[i-1][a[i]-j]

43.④处应填()。 {{ select(43) }}

  • A. j+a[i] < sum
  • B. j+a[i] <= sum
  • C. j+a[i-1] < sum
  • D. j+a[i-1] <= sum

44.⑤处应填( )。 {{ select(44) }}

  • A. ans += f[n][i-1]
  • B. ans += f[n-1][i-1]
  • C. ans += f[n][i]
  • D. ans += f[n-1][i]

初赛模拟卷E

Not Attended
Status
Done
Rule
OI
Problem
2
Start at
2024-8-19 16:15
End at
2024-8-20 13:45
Duration
2 hour(s)
Host
Partic.
36