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分;每题有且仅有一个正确选项)
- 2024 的因子与质因子分别有( )个。 {{ select(1) }}
- A.18和3
- B.16和3
- C.15和3
- D.16和4
- 使用邻接矩阵表示N个结点的有向图,所需要的存储空间为( )。 {{ select(2) }}
- A.
- B.
- C.
- D.
- 在C++程序中,表达式a%=b与下列哪个表达式是等价的?() {{ select(3) }}
- A.
a=%b
- B.
a/=b
- C.
a=b%a
- D.
a=a%b
- 线性表若采用链表存储结构,则要求内存中可用存储单元地址( )。{{ select(4) }}
- A. 必须连续
- B. 必须不连续
- C. 连续或不连续都行
- D. 部分连续
- 我们输入一个新闻网站的网址便可访问该网站,其中用到的网络协议是( ) {{ select(5) }}
- A. DNS
- B. FTP
- C. SSH
- D. TELNET
- 以下哪个不属于STL中栈的操作函数?( ) {{ select(6) }}
- A.
empty
- B.
front
- C.
push
- D.
pop
- 平面上任取 个整点(横坐标和纵坐标都是整数),其中一定存在两个点,它们的中 点也是整点,那么 至少是( )。 {{ select(7) }}
- A. 4
- B. 5
- C. 6
- D. 7
- 以下哪个操作属于位运算范畴?( ) {{ select(8) }}
- A.
&&
- B.
||
- C.
>>>
- D.
^
9.关于树这种数据结构,下面的说法中哪个是正确的?( ) {{ select(9) }}
- A. 满二叉树的结点总数一定是奇数
- B. 完全二叉树的结点总数一定是奇数
- C. 树形结构只有双亲表示法和孩子表示法
- D. 二叉树的遍历方法只有前序遍历法和后序遍历法
- 以下哪个选项不属于头文件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
- 在图的广度优先搜索中,要维护一个标识数组表示已经访问过的图的结点,需要()数据结构存放结点以实现遍历。 {{ select(13) }}
- A. 栈
- B. 队列
- C. 哈希表
- D. 堆
- 从一个 的棋盘(不可旋转)中选取不在同一行也不在同一列的两个方格,共有( )种方法。 {{ select(14) }}
- A. 480
- B. 450
- C. 360
- D. 720
- 下列关于集合的说法哪个不正确?() {{ 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
- 去掉第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
选择题
- 若输入
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)在图像编码的算法中,需要对一个给定的方形矩阵进行 字形扫描。给定一个 的矩阵,字形扫描的过程如下图所示。
对 的矩阵
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字形扫描的程序。给定一个 的矩阵,输出对这个矩阵进行Z字形扫描的结果。
输入格式:
输入的第1行包含一个整数n,表示矩阵的大小。输入的第2行到第n+1行每行包含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
评测用例规模与约定:
,矩阵元素为不超过 的正整数。
#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%的评测用例,;
对于所有评测用例,,N个砝码的总重量不超过 。
#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
- 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