#4459. 普及组 CSP-J 第8套初赛模拟试题
普及组 CSP-J 第8套初赛模拟试题
一.单项选择题
共15题,每题2分,共30分;每题有且仅有一个正确选项。
- IPv4中,以下IP地址不合法的是( ) {{ select(1) }}
- 255.255.255.255
- 0.1.1.1
- 1.1.1.0
- 1.0.0.0
-
已知A,B,C是3个二进制数,符号是∧表示逻辑与运算,符号就∨表示逻辑或运算。
若A=1100 1101 0011
B = 1100 0111 0110
C = 0011 0110 1010则表达式(A∨B)∧(A∨C)的值为( ) {{ select(2) }}
- 1100 1110 0001
- 0011 0010 1111
- 1100 1111 0011
- 1100 0111 0001
- Linux下可执行文件的默认扩展名为( )
{{ select(3) }}
- exe
- chm
- dll
- 都不是
- 八进制数7042转化为十六进制数是( )
{{ select(4) }}
- 3521
- F22
- E22
- 111000100010
- 以下排序算法中,不需要进行关键字比较操作的算法是( )
{{ select(5) }}
- 基数排序
- 冒泡排序
- 堆排序
- 直接插入排序
- 一个袋子中有3个蓝球,2个红球,2个黄球,则从中抽出三个球颜色各不相同的概率是多少?( )
{{ select(6) }}
- 10/21
- 13/33
- 12/35
- 3/7
- 定义L数:素数或者是回文数满足两者中任意一个条件的数。大于等于10并且小于等于120的“L数”共有多少个?(注:回文数指从左到右读与从右到左读是相同的,如“121”、“1331”;两个条件都成立也是L数,如“131”)( ) {{ select(7) }}
- 34
- 35
- 36
- 37
- 定义一颗有根树的深度:根结点的深度为0,其余结点的深度等于该结点的父亲结点的深度加1。以下数字中哪一个可以作为一颗深度为9的完全二叉树的总节点数?( )
{{ select(8) }}
- 511
- 510
- 1023
- 1026
- 共9个互不相同的数,它们的最大公约数是2021的一个大于1的因子(6有2、3、6这三个大于1的因子,因子可以包含自身),且这9个数的和小于等于2021,则这9个数的和是多少?( )
{{ select(9) }}
- 1849
- 1935
- 2021
- 1927
-
以下哪位科学家被称为“博弈论之父”,“现代计算机之父”?( )
{{ select(10) }}
- 图灵
- 冯诺依曼
- 塔扬
- 比尔盖茨
- 设栈S和队列Q初始状态为空,元素a₁,a₂,…,a₆依次通过栈S,一个元素出栈后就进入队列Q,若出队的顺序分别是a₂,a₄,a₃,a₆,a₅,a₁,则栈S的容量至少是( ) {{ select(11) }}
- 2
- 3
- 4
- 5
- 对有序数组{5,13,19,21,37,56,64,75,88,92,100}进行二分查找,等概率的情况下查找成功的平均查找长度(平均比较次数)是( ) {{ select(12) }}
- 35/11
- 34 /11
- 3
- 32/11
- 一个n个顶点的强连通图最少有几条边( )。
{{ select(13) }}
- n
- n+1
- n-1
- n * ( n-1)
- 在1和2015之间(包括1和2015在内)不能被4、5、6三个数任意一个数整除的数有几个?( ) {{ select(14) }}
- 1035
- 1105
- 1075
- 2000
- 关于Catalan数Cn,下列说法中错误的是( )。 {{ select(15) }}
- Cn表示有n+1个结点的不同形态的二叉树的个数。
- Cn表示含n对括号的合法括号序列的个数。
- Cn表示长度为n的入栈序列对应的合法出栈序列个数。
- Cn表示通过连接顶点而将n+2边的凸多边形分成三角形的方法个数。
二、阅读程序
程序输入不超过数组或字符串定义的范围;除特殊说明外,判断题1.5分,选择题4分,共计40分
(1)
#include<iostream>
using namespace std;
int p;
void fun(int &x, int &y);
void func(int &x, int &y)
{
if(y>x)
return;
x--;
y/=2;
fun(x,y);
}
void fun(int &x, int &y)
{ if(x==1)
return;
x/=2;
y+ =p;
func( x,y);
}
int main()
{
int x,y;
cin>>x>>y>>p;
fun(x,y);
cout<<x<<''<<y;
return 0;
}
- 将第四行的&去除后,程序仍能通过编译。( ) {{ select(16) }}
- 正确
- 错误
- 读入的x,y,p为int范围内任意值时程序均能完成运行。( ) {{ select(17) }}
- 正确
- 错误
- 若x=1时,输出的x,y与输入的一致。( ) {{ select(18) }}
- 正确
- 错误
- 输出的x必然小于等于输入的x。( ) {{ select(19) }}
- 正确
- 错误
- 输入为7 33 2时,输出为( ) {{ select(20) }}
- 4 31
- 4 35
- 3 31
- 3 35
- 输入为33 7 2时,输出为( ) {{ select(21) }}
- 5 3
- 3 5
- 6 4
- 4 6
(2)
#include<iostream>
using namespace std;
const int maxn=105;
int n,a[maxn],b[maxn];
int main()
{
cin >> n;
int x;
for ( int i = 1;i <= n;i++)
{
cin >> x;
a[i] = b[i ] = x ;
}
for(int i = 1;i <= n;i++)
for (int j = i+ 1;j <= n;j++)
{
if ( a[i] > a[j] )
swap( a[i],a[j]) ;
if ( b[i] < b[j] )
swap( b[i],b[j]) ;
}
for ( int i = 1 ;i < = n;i++)
cout < < a[i] << " ";
cout << "\n";
for ( int i = 1;i < = n;i++)
cout << b[i] << " ";
cout<< "\n";
return 0;
}
- 若输入的X[1],X[2],⋯,X[N]中有相同的数,程序会陷入死循环。( ) {{ select(22) }}
- 正确
- 错误
- 当且仅当输入的X[1],X[2],…,X[N]全部相同时输出的两行结果相同。( ) {{ select(23) }}
- 正确
- 错误
- 该算法的原理是基数排序。( ) {{ select(24) }}
- 正确
- 错误
- 若输入的X[1],X[2],⋯,X[N]互不相同,则下列说法正确的是( ) {{ select(25) }}
- 输出的两行结果相同
- 将输出的第一行结果整体翻转后,将与第二行相同
- 将输出的第一行结果的第一项与最后一项交换后,将与第二行相同
- 以上说法都不正确
- 下列说法不正确的是( ) {{ select(26) }}
- 输出的第一行即为将X[1],X[2],…,X[N]从小到大排序后得到的结果
- 输出的第二行即为将X[1],X[2],⋯,X[N]从大到小排序后得到的结果
- 若将“a[i]>a[j]”改为“a[i]>=a[j]”,则程序输出无变化
- 不存在时间复杂度更优的能与本程序达到相同目的的算法
- 该程序的时间复杂度为( ) {{ select(27) }}
- O(n)
- O(nlogn)
- O(n²)
- O(n)
(3)
#include<iostream>
using namespace std;
int main()
{
int num=0;
cin>>num;
//保证num>=100,且在int范围内
int max_primedivisor=0;
int cnt=1;
for(int i=2;i*i<=num;i++)
{
if(num%i==0)
{
int tmp=1;
while(num%i==0) num/=i, tmp++;
max_primedivisor= max( max_primedivisor,i);
sum*=tmp;
}
}
primedivisor= max( maxprimedivisor, num);
if(num>1)
cnt*=2;
cout<< max_primedivisor<<""<< cnt<<"\n";
return 0;
}
- 代码中 max_primedivisor= max( max_primedivisor, num);这句话去掉对答案没有影响。( ) {{ select(28) }}
- 正确
- 错误
- 当读入的num=p*q,其中p<q,且p,q为质数,则for 循环中i遍历到q时退出循环。 ( ) {{ select(29) }}
- 正确
- 错误
- 该算法的最坏时间复杂度为( ) {{ select(30) }}
- O(lognum)
- O()
- O(num)
- O(num)
- 当读入2021时输出为( ) {{ select(31) }}
- 43 2
- 43 4
- 47 2
- 47 4
- 当读入的数num=p*p*p*q*q*r*r*s*t时,其中p 均为质数,则输出的第二个数( )
{{ select(32) }}
- 不确定
- 9
- 12
- 144
- 在最好的情况下,时间复杂度为( ) {{ select(33) }}
- O(lognum)
- O()
- O(num)
- O(num)
三、完善程序
单选题,除特殊说明外,每小题3分,共计30分。
(1)(电电鼠与方阵) \有一个n*n(2<=n<=5000)的方阵,其中每个方格有一个电力值。小Y可以在这个方阵中得到电力,方法就是在一些方格放上电电鼠来吸收电力,这样就可以获得这些方格上的电力。不过放的电电鼠须要遵循两个规则:1.一个方格最多只能放一只电电鼠;2.所有2*2的子矩阵(共有(n-1)*(n-1)个)必须恰好包含两只电电鼠。小Y用了一个程序求出了能获得的最大总电力值。
试补全程序。
#include<bits/stdc++.h>
using namespace std;
const int N =5100;
int a ① ;
int main()
{
int n, ansl = 0,ans2 = 0;
scanf( "%d",&n) ;
for ( int i = 1;i < = n;i++)
for ( int j = 1;j <= n;j++)
scanf( "%d",&a[i][j]);
for ( int i = 1;i < = n;i++)
{
int odd=0, even =0;
for ( int j = 1;j <= n;j++)
{
int x= ② ;
if(j &1)
odd +=x;
else even += x;
}
ans1 += max(odd, even);
}
for ( int i = 1 ;i < = n;i++)
{
int odd =0, even =0;
for ( int j = 1;j < = n;j++)
{
int x= ③ ;
if( ④ )
even+=x;
else
odd+=x;
}
ans2+= max(odd, even);
}
printf("%d\n", ⑤ );
return 0;
}
- ①处应填() {{ select(34) }}
- [N][2]
- [2][N]
- [N][1100]
- [5100][5100]
- ②处应填() {{ select(35) }}
- a[j][i]
- a[i][j]
- a[i+j][( i+j)&1]
- a[( i+j)&1][i+j]
- ③处应填() {{ select(36) }}
- a[j][i]
- a[i][j]
- a[i+j][( i+j)&1]
- a[( i+j)&1][i+j]
- ④处应填() {{ select(37) }}
- j & 1
- j | 1
- !( j & 1)
- !( j | 1 )
- ⑤处应填() {{ select(38) }}
- max(ans1,ans2)
- min(ans1,ans2)
- ans1 + ans2
- max(ans1,ans2)-min(ans1,ans2)
(2)(排列) 给定一个1~n的排列A,你需要给出一个1~n的排列B,使得排列B的字典序的值最小。输出字典序最小的排列B。
输入两行,第一行一个正整数n,
第二行n个整数表示排列A。
提示:将问题分为n是奇数和n是偶数考虑,贪心处理。
试补全程序。
#include<iostream>
#include<cstring>
using namespace std;
int A[1000010];
int B[1000010];
int C[1000010];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&A[i]);
if( ① )
{
int p1=0; int p2= ② ;
for(int i=1;i< =n;i++)
{
if(A[i]>n/2)
{
B[i]=++p1;
}
else
{
B[i]=++p2;
}
}
}
else
{
int p1=0;int p2=n/2;
for(int i=1;i< =n;i++)
{
if(A[i]> ③ )
{
B[i]=++p1;
}
else
{
B[i]=++p2;
}
}
p1=0;
p2=n/2+1;
for(int i=1;i< =n;i++)
{
if(A[i]>= ④ )
{
C[i]=++p1;
}
else
{
C[i]=++p2;
}
}
int flag=0;
for(int i=1;i< =n;i++)
{
if(B[i]<C[i])
{
flag=1;
break;
}
if(B[i]>C[i])
{
flag=2;
break;
}
}
}
if(flag!= ⑤)
swap(B,C)
for(int i=1;i<n;i++)
printf("%d",B[i]);
printf("%d\n",B[n]);
return 0;
}
- ①处应填() {{ select(39) }}
- n%2==0
- n%2==1
- n==1
- n==2
- ②处应填( ) {{ select(40) }}
- p1
- n/2-1
- n/2
- n/2+1
- ③处应填( ) {{ select(41) }}
- p1
- n/2-1
- n/2
- n/2+1
- ④处应填( ) {{ select(42) }}
- p1
- n/2-1
- n/2
- n/2+1
- ⑤处应填( ) {{ select(43) }}
- 0
- 1
- 2
- 3