#ACSP1006. cspj-模拟题6
cspj-模拟题6
普及组CSP-J 2024初赛模拟卷6
单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项)
- 2024的因子与质因子分别有({{ select(1) }})个。
- 18和3
- 16和3
- 15和3
- 16和4
- 使用邻接矩阵表示N个结点的有向图,所需要的存储空间为({{ select(2) }})。
- .N×(N+1)
- N²
- N×(N-1)
- N×(N-1)/2
- 在C+++程序中,表达式a%=b与下列哪个表达式是等价的? ({{ select(3) }})。
- a=%b
- a/=b
- a=b%a
- a=a%b
- 线性表若采用链表存储结构,则要求内存中可用存储单元地址({{ select(4) }})。
- 必须连续
- 必须不连续
- 连续或不连续都行
- 部分连续
- 我们输入一个新闻网站的网址便可访问该网站,其中用到的网络协议是({{ select(5) }})。
- DNS
- FTP
- SSH
- TELNET
- 以下哪个不属于STL中栈的操作函数? ({{ select(6) }})。
- empty
- front
- push
- pop
- 平面上任取n个整点(横坐标和纵坐标都是整数),其中一定存在两个点,它们的中点也是整点,那么n至少是({{ select(7) }})。
- 4
- 5
- 6
- 7
- 以下哪个操作属于位运算范畴? ({{ select(8) }})
88
||
>>>
^
- 关于树这种数据结构,下面的说法中哪个是正确的? ({{ select(9) }})
- 满二叉树的结点总数一定是奇数
- 完全二叉树的结点总数一定是奇数
- 树形结构只有双亲表示法和孩子表示法
- 二叉树的遍历方法只有前序遍历法和后序遍历法
- 以下哪个选项不属于头文件cmath? ({{ select(10) }})
- find(iterator first, iterator last, int x)
- abs(int x)
- ceil(double x)
- pow(double x, double y)
- 在C++语言中, 表达式584|3的值等于({{ select(11) }})。
- 7
- 5
- 4
- 3
- 定义变量 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; }
- 0
- -5
- -7
- 7
- 在图的广度优先搜索中,要维护一个标识数组表示已经访问过的图的结点,需要({{ select(13) }})数据结构存放结点以实现遍历。
- 栈
- 队列
- 哈希表
- 堆
- 从一个6×6的棋盘(不可旋转)中选取不在同一行也不在同一列的两个方格,共有({{ select(14) }})种方法。
- 480
- 450
- 360
- 720
- 下列关于集合的说法哪个不正确? ({{ select(15) }})
- 一个元素是否属于一个集合是确定的
- 集合中的元素两两不同
- 0属于空集
- 集合中的元素不存在先后次序
阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填✔,错误填✘;除特殊说明外,判断题每题1.5分,选择题每题3分,共计40分)
(1)
#include <bits/stdc++.h>
using namespace std;
int main()
{
set<int> s;
srand(time(0));
int n=6;
int l=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++] = *it;
for(int i=0; i<n; i++)
{
int x= rand()%n;
int y= rand()%n;
if(a[x] > a[y])
swap(a[x],a[y]);
}
for(int i=0; i<n; i++)
cout<<a[i]<<" ";
return 0;
}
判断题 16.若去掉第6行,程序的输出结果不受任何影响。 ({{ select(16) }}})
- 正确
- 错误
17.若去掉第8行,程序的输出结果中的数字总数不变。 ({{ select(17) }}})
- 正确
- 错误 18.程序的输出结果是一个从小到大排列的整数序列。 ({{ select(18) }}})
- 正确
- 错误
19.将第10行中的s.size()替换成s.length(),程序的运行结果不会改变。 ({{ select(19) }}})
- 正确
- 错误
选择题
- 将第13行s.insert(k)替换成for(int i=1;i<=6;i++)s.insert(i), 则输出为({{ select(20) }})。
- 12 3 4 5 6
- 6 5 4 3 2 1
- 1 2 3 6 5 4
- 1~6随机分布值
21.将第13行s.insert(k)替换成 for(int i=1;i<=7;i++) s.insert(i), 第20行替换为 int x=i+1, 第21行替换为 int y=i, 则输出为({{ select(21) }})。
- 1 2 3 4 5 6
- 6 5 4 3 2 1
- 2 3 4 5 6 7 1
- 2 3 4 5 6 7
(2)
#include <bits/stdc++.h>
using namespace std;
int month[13]={-1,31,28,31,30,31,30,31,31,30,31,30,31};
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])
return true;
return false;
}
int main()
{
cin>>date;
y=date/10000;
m= date/100%100;
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;
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;
}
判断题
22.将第3行中的-1改为0,程序的运行不受任何影响。 ({{ select(22) }})
- 正确
- 错误
23.去掉第15行中的&& s[1]==s[4] && s[1]==s[6], 程序的输出不变。 ({{ select(23) }})
- 正确
- 错误
24.将第23行m= date/100%100替换为 m= date%10000/100, 程序的输出不变。({{ select(24) }})
- 正确
- 错误
25.将第30行改为 int j; if(i==y && j==1 || i!=y && j==0) j=m
, 程序的输出不变。 ({{ select(25) }})
- 正确
- 错误
选择题
- 若输入20240204, 则输出为({{ select(26) }})。
- 20240204 20300302
- 20300302 20400402
- 20400402 21211212
- 20300302 21211212
- 若输出20011002 20200202, 则输入可能为({{ select(27) }})。
- 20011002
- 20001001
- 20020101
- 20020202
(3)
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 100;
bool PrimeNumberJudge(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& GetNumberSize(const int & num){
int digit = 0, val = num;
while(val){
val /= 10;
digit++;
}
return digit;
}
vector<int>& GetDigits(const int & num, vector<int> & digits){
int factor = 0;
for(int num_size= GetNumberSize(num); num_size>0; num_size--){
factor = num %(int) pow(10.0, num_size);
factor = factor/(int) pow(10.0, num_size-1);
digits.push_back(factor);
}
return digits;
}
vector<int>& GetKAdjacent(const int &num, vector<int>& adjacent){
vector<int> digits_number;
char tmp[128], buf_tmp[128];
GetDigits(num , digits_number);
int digits = GetNumberSize(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", digits_number.at(j+k));
buf += tmp;
k++;
}
for(int i=0;i<= buf_tmp.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 (PrimeNumberJudge(i)){
vector<int> buf;
GetKAdjacent(i, buf);
int sign = 1;
for (int j = 0; j < buf.size(); j++){
if (! PrimeNumberJudge(buf.at(j))){
sign = 0;
break;
}
}
if(sign)
count++;
}
}
cout<< count;
return 0;
}
判断题
- 若将第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) }})。
- 7
- 8
- 9
- 10
33.若将MAXN = 100改为MAXN = 2024, 程序的输出结果为({{ select(33) }})。
- 9
- 10
- 11
- 12
34.(4分)若将MAXN = 100改为MAXN = 2024, 程序的输出结果为({{ select(34) }})。
- 11
- 10
- 9
- 大于11的整数
完善程序(单选题,每小题3分,共计30分)
(1) 在图像编码的算法中,需要对一个给定的方形矩阵进行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, x, 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 = 1; 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) }})。
- p[0][0]
- p[0][1]
- p[1][0]
- p[1][1]
36.②处应填({{ select(36) }})。
- v[0][0] = 1
- v[1][1] = 1
- v[0][1] = 1
- v[1][0] = 1
37.③处应填({{ select(37) }})。
- t < n*n
- t <= n*n
- t < n
- t <= n
38.④处应填({{ select(38) }})。
- v[x+1][y-1]
- v[x-1][y+1]
- !v[x+1][y-1]
- !v[x-1][y+1]
39.⑤处应填({{ select(39) }})。
- exit
- return 0
- continue
- break
(2) 你有一架天平和N个砝码,这N个砝码的重量依次是 请计算:一共可以称出多少种不同的重量?注意砝码可以放在天平两边。
输入格式:
输入的第1行包含一个整数N,表示砝码的总数。第2行包含N个整数:
输出格式:
输出一个整数代表答案。
输入样例:
3
1 4 6
输出样例:
10
样例说明:
能称出的10种重量是1、2、3、4、5、6、7、9、10、11。
#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(④)
f[i][j] |= f[i - 1][j + a[i]];
}
}
for(int i = 1; i <= sum; i++)
⑤;
cout << ans;
return 0;
}
40.①处应填({{ select(40) }})。
- sum += a[i]
- sum += a[1]
- sum += a[n]
- sum = a[i]
41.②处应填({{ select(41) }})。
- j = f[i][j]
- j = sum-1
- j = n
- j = sum
42.③处应填({{ select(42) }})。
- f[i-1][j-a[i]]
- f[i-1][abs(j-a[i])]
- f[i][abs(j-a[i])]
- f[i-1][a[i]-j]
43.④处应填({{ select(43) }})。
- j >= i
- j >= 0
- j > i
- j > 0
44.⑤处应填({{ select(444) }})。
- ans=max(ans, f[i]+g[i]-1)
- ans=max(f[i], g[i]-1)
- ans=max(ans, f[i]+g[i])
- ans=max(g[i], f[i]-1)