#46. 一本通 CSP-J 初赛模拟题第十三套
一本通 CSP-J 初赛模拟题第十三套
一、选择题
- 下列关于程序和编译程序的四条叙述,其中正确的是( )
{{ select(1) }}
- 解释程序产生目标程序
- 编译程序产生目标程序
- 解释程序和编译程序都产生目标程序
- 解释程序和编译程序都不产生目标程序
- 进制数(-123)的原码表示为( )
{{ select(1) }}
- 11111011
- 10000100
- 1000010
- 01111011
- 网络管理员排查无法访问
www.cisco.com的故障,发现在浏览器中键入 web 服务器的 IP 地址可以访问网页,那故障应该归咎于哪个应用层协议( )。
{{ select(1) }}
- DHCP
- DNS
- HTTP
- POP3
- 以下程序段执行完毕后,输出的结果是( )
#include<bits/stdc++.h>
using namespace std;
int prime(int n) {
int i, y = 1;
for (i = 2; i * i <= n; i++) {
if (n % i == 0) {
y = 0;
break;
}
}
return y;
}
int main() {
int m = 90, n = 100;
while (m != (n + 1)) {
if (prime(m) == 1) cout << m << " ";
m++;
}
return 0;
}
{{ select(1) }}
- 91
- 97
- 91 97
- 91 95 97
- 若已知一个栈的入栈序列是1,2,3...n,其输出序列为( p_1,p_2,p_3...),若( p_1=n ),则( p_i )为
{{ select(1) }}
- ( i )
- ( n-i )
- ( n-i+1 )
- 不确定
- 使用分治法求解不需要满足的条件是( )
{{ select(1) }}
- 子问题必须是一样的
- 子问题不能够重复
- 子问题的解可以合并
- 原问题和子问题使用相同的方法解
- 如图,在5×7的方格表中有多少个形状为
的图形?

{{ select(1) }}
- 42
- 15
- 76
- 20
- 堆的形状是一棵( )
{{ select(1) }}
- 二叉排序树
- 满二叉树
- 完全二叉树
- 平衡二叉树
- 围着一张圆桌给3名男生,6名女生安排座位,座位没有编号。如果两名男生之间恰有两名女生,共有多少种安排座位的方法( )
{{ select(1) }}
- 392
- 1440
- 2160
- 2880
- 100以内的质数有( )个。
{{ select(1) }}
- 25
- 26
- 27
- 28
- 一盒围棋子,4个4个数多3个,6个6个数多5个,15个15个数多14个,棋子在150~200个,棋子共几个?
{{ select(1) }}
- 167
- 179
- 194
- 以上都不对
- 数据结构中,“先进先出”是( )结构的特征。
{{ select(1) }}
- 队列
- 栈
- 线性表
- 树
- 右图所示二叉树的中序序列是( )

{{ select(1) }}
- DHEBAFJCG
- DHEBAFJICG
- DBHEAFCJIG
- DBHEAFJICG
- 表达式的后缀表达式
931-3*+102/+的值为
- 45
- 19
- 20
- 51
二、阅读程序
程序1
#include<bits/stdc++.h>
using namespace std;
long long normalPower(long long base, long long power) {
long long result = 1;
for (int i = 1; i <= power; i++) {
result = result * base;
}
return result;
}
int main() {
long long m, n;
while (true) {
cin >> m >> n;
if (m == 0 && n == 0) break;
cout << normalPower(m, n) << endl;
}
return 0;
}
判断题
- 输出的结果为三位数。( )
- 对
- 错
- 将第5行的
<=改为<则输出结果不变。( )
- 对
- 错
- 将第13行true 改为 1 ,程序运行结果不会改变()
- 对
- 错
- 将第15行删除,结果不会改变。( )
- 对
- 错
选择题
-
如果输入2和12,则输出结果为多少
- 4
- 96
- 096
- 4096
-
(4分)这个算法的时间复杂度为( )
- (O(m \times n))
- (O(n))
- (O(m))
- (O(m^2))
程序2
#include<bits/stdc++.h>
using namespace std;
const int N = 1000;
int a[N], vis[N];
int main() {
int n, k, m;
cin >> n >> k >> m;
int cnt = 0, cnt2 = 1, num = 0;
while (cnt < n - 1) {
int pos = k + cnt2;
pos = pos % n;
if (!vis[pos]) {
num++;
if (num % m == 0) {
vis[pos] = 1;
cnt++;
}
}
cnt2++;
}
for (int i = 1; i <= n; i++) {
if (!vis[i]) {
cout << i << endl;
break;
}
}
return 0;
}
判断题
- 上述代码中将第29行 == 修改为 >=,输出结果一定不变。( )
- 对
- 错
- 上述代码中,将第29、30行删除,输出结果也一定相同。( )
- 对
- 错
- 上述代码中,输入的
k值可以大于n。( )
- 对
- 错
- 上述代码中,输入的
m值可以大于n。( )
- 对
- 错
选择题
- 当输入为:12 3 8,输出为( )
- 1
- 3
- 7
- 9
- (4分)上述代码中,利用数组模拟的是( )
- 队列
- 环
- 树
- 以上都不是
程序3
#include<bits/stdc++.h>
using namespace std;
int select_arr(int arr[], int len, int arr_value) {
int left = 0;
int right = len - 1;
while (left <= right) {
int mid = (left + right) / 2;
int mid_value = arr[mid];
if (mid_value == arr_value) {
return mid;
} else if (mid_value > arr_value) {
right = mid - 1;
} else if (mid_value < arr_value) {
left = mid + 1;
}
}
return -1;
}
int main() {
int arr[10] = {1, 3, 5, 7, 9, 10, 16, 46, 88, 91};
int weizhi = select_arr(arr, 10, 16);
cout << weizhi;
return 0;
}
判断题
- 数组
arr的值可以为负数。( )
- 对
- 错
- 若第31行代码为
int arr[10] = {1, 3, 7, 5, 9, 10, 16, 46, 88, 91},输出结果是一样的。( )
- 对
- 错
- 数组数值越大,排序效率越低。( )
- 对
- 错
- 当数组数据量越大时,和顺序查找相比优势越明显。( )
- 对
- 错
选择题
- (4分)程序输出结果为( )
- 4
- 5
- 6
- 7
- (4分)该程序的算法为( )
- 顺序查找
- 二分查找
- 哈希查找
- 分块查找
三、完善程序
1. 一元三次方程求根
#include<bits/stdc++.h>
using namespace std;
double a, b, c, d;
double f(double x) { //返回一元三次方程值
return 1.0 * a * pow(x, 3) + b * pow(x, 2) + c * pow(x, 1) + d;
}
double mid(double x, double y) {
double st = x, en = y, mid = (st + en) * 1.0 / 2;
while ((double)fabs(f(mid)) > 0.000001) {
if (f(st) * f(mid) > 0) {
st = mid;
} else if (f(en) * f(mid) > 0) {
en = mid;
}
mid = (st + en) * 1.0 / 2;
}
return mid; //找到根
}
int main() {
cin >> a >> b >> c >> d;
double x = -100, y = -100;
int num = 0;
double c[3];
while (num < 3) {
if (f(x) * f(y) > 0) {
y += 0.9;
} else {
c[num] = mid(x, y);
num++;
x = y; //继续往后遍历
}
}
printf("%.2lf %.2lf %.2lf", c[0], c[1], c[2]);
return 0;
}
填空题
-
①处应填( )
int xfloat xdouble xlong long x
-
②处应填( )
xymiden
-
③处应填( )
x + yyst + enen
-
④处应填( )
num < 1num < 2num < 3num < 4
-
⑤处应填( )
f(x) * f(y)xmid(x, y)y
2. Dijkstra算法
#include<bits/stdc++.h>
using namespace std;
int n, m;
const int inf = 0x3f3f3f3f;
long long a[20020];
struct node {
int u, v, w;
} mp[200002];
void dj() {
for (int i = 2; i <= n; i++) {
int k = -1;
for (int j = 2; j <= n; j++) {
if (!vis[j] && (k == -1 || a[j] < a[k])) {
k = j;
}
}
vis[k] = 1;
for (int j = 1; j <= m; j++) {
if (mp[j].u == k) {
a[mp[j].v] = min(a[mp[j].v], a[k] + mp[j].w);
}
}
}
}
int main() {
cin >> n >> m;
memset(a, inf, sizeof(a));
for (int i = 1; i <= m; i++) {
cin >> mp[i].u >> mp[i].v >> mp[i].w;
}
a[1] = 0;
dj();
for (int i = 2; i <= n; i++) {
cout << a[i] << endl;
}
return 0;
}
填空题
-
①处应填( )
i < ni <= ni < mi <= m
-
②处应填( )
j < nj <= nj < mj <= m
-
③处应填( )
a[mp[j].u] + mp[j].wa[mp[j].v] + mp[j].wa[mp[i].u] + mp[i].wa[mp[i].v] + mp[i].w
-
④处应填( )
k = 0k = 1k = -1k = 2
-
⑤处应填( )
mp[i].va[i]mp[i].ump[a[i]].u