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

2.使用邻接矩阵表示N个结点的有向图,所需要的存储空间为( )。 {{ select(2) }}

  • A.NX(N+1)
  • B.N2
  • C.N×(N-1)
  • D.N×(N-1)/2

3.在C++程序中,表达式a%=b与下列哪个表达式是等价的?() {{ select(3) }}

  • A.a=%b
  • B.a/=b
  • C.a=b%a
  • D.a=a%b

4.线性表若采用链表存储结构,则要求内存中可用存储单元地址( )。{{ 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

7.平面上任取n个整点(横坐标和纵坐标都是整数),其中一定存在两个点,它们的中 点也是整点,那么n至少是( )。 {{ select(7) }}

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

8.以下哪个操作属于位运算范畴?( ) {{ select(8) }}

  • A.66
  • B.11
  • 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++语言中,表达式584|3的值等于( )。 {{ select(11) }}

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

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

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

13.在图的广度优先搜索中,要维护一个标识数组表示已经访问过的图的结点,需要 ()数据结构存放结点以实现遍历。 {{ select(13) }}

  • A.栈 B.队列 C.哈希表 D.堆

14.从一个6×6的棋盘(不可旋转)中选取不在同一行也不在同一列的两个方格,共有 ( )种方法。 {{ select(14) }}

  • A.480 B.450 C.360 D.720

15.下列关于集合的说法哪个不正确?() {{ 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));
	int n=6;
	int 1=12;
	int k,i=0,a[n];
	while(s.size()<n)
	{
		k=rand()%10+1;
		s.insert(k);
	}
	set <int>::iterator it;
	for(it=s.begin();it!=s.end(); it++)
		a[i++] = xit;
	for(int i=0; icn; i++)
	{
		int x=rand()%n;
		int y=rand()%n;
		if(a[x] > aly])
		swap(alx],aly]);
	}
	for(int i=0; icn; i++)
		cout<<ali]<<" ";
	return 0;
}

判断题 16.若去掉第6行,程序的输出结果不受任何影响 () {{ select(16) }} 17.若去掉第8行,程序的输出结果中的数字总数不变。 () {{ select(17) }} 18.程序的输出结果是一个从小到大排列的整数序列。 () {{ select(18) }} 19.将第10行中的s.size()替换成s.length(),程序的运行结果不会改变。() {{ select(19) }} 选择题 20.将第13行s.insert(k)替换成for(int izl;ic=6;i++)s.insert(i),则输出 为( )。 {{ select(20) }}

  • A.1 2 3 4 5 6
  • B.654321
  • C.1236 54
  • 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.123456
  • B.6 5432 1
  • C.2 345671
  • D.2 3 4 56 7

(2)

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

注:输入为8位数字。 判断题 22.将第3行中的-1改为0,程序的运行不受任何影响。 () {{ select(22) }} 23. 去掉第15行中的88 s[1]s[4] &8 s[1]s[6],程序的输出不变。 () {{ select(23) }} 24.将第23 行m=date/100%100替换为m=date%10000/100,程序的输出不变。 ( ) {{ select(24) }} 25.将第30行改为int j;if(iy 88 j1 || il=y 88 j==0)j=m,程序的输 出不变。 ( ) {{ select(25) }} 选择题 26. 若输入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 8num, vector<int>6adjacent){
	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;ic=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) }} 29.若将第7行中的i<num替换为i*i<=num,程序的运行结果不会改变。( ) {{ select(29) }} 30.本程序用到的vector属于STL。 ( ) {{ select(30) }} 31.若将MAXN=100替换为MAXN=70,程序的运行结果不会改变。 (){{ select(31) }} 选择题 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)在图像编码的算法中,需要对一个给定的方形矩阵进行Z字形扫描。给定一个n×n 的矩阵,Z字形扫描的过程如下图所示。

image

对4×4的矩阵 1539 3756 9464 7313 进行Z字形扫描后得到长度为16的序列: 1539739547366413 请实现一个Z字形扫描的程序。给定一个n×n的矩阵,输出对这个矩阵进行Z字形扫描的结果。 输入格式: 输入的第1行包含一个整数n,表示矩阵的大小。输入的第2行到第n+1行每行包含n个正整数,由空格分隔,表示给定的矩阵。 输出格式: 输出一行,包含n×n个整数,由空格分隔,表示输入的矩阵经过Z字形扫描后 的结果。 输入样例: 4 1539 3756 9464 7313 输出样例: 1539739547366413 评测用例规模与约定: 1<n 500,矩阵元素为不超过1000的正整数。

#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;jc=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 66 y-1>=1 66 4)
	{
		++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 88 y+1 <= n 8& !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%的评测用例,1<N 15; 对于所有评测用例,1 N 100,N个砝码的总重量不超过10°。

#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] l= 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.ff1][abs()-a(1])]
  • D.f[i-1][a[i]-j]

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

  • A.j+ali] < 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]

[2024笔试] CSP - J考前刷题

Not Attended
Status
Done
Rule
OI
Problem
10
Start at
2024-8-12 4:30
End at
2024-8-12 5:30
Duration
1 hour(s)
Host
Partic.
2