#46. 一本通 CSP-J 初赛模拟题第十三套

一本通 CSP-J 初赛模拟题第十三套

一、选择题

  1. 下列关于程序和编译程序的四条叙述,其中正确的是( )

{{ select(1) }}

  • 解释程序产生目标程序
  • 编译程序产生目标程序
  • 解释程序和编译程序都产生目标程序
  • 解释程序和编译程序都不产生目标程序
  1. 进制数(-123)的原码表示为( )

{{ select(1) }}

  • 11111011
  • 10000100
  • 1000010
  • 01111011
  1. 网络管理员排查无法访问 www.cisco.com 的故障,发现在浏览器中键入 web 服务器的 IP 地址可以访问网页,那故障应该归咎于哪个应用层协议( )。

{{ select(1) }}

  • DHCP
  • DNS
  • HTTP
  • POP3
  1. 以下程序段执行完毕后,输出的结果是( )
#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. 若已知一个栈的入栈序列是1,2,3...n,其输出序列为( p_1,p_2,p_3...),若( p_1=n ),则( p_i )为

{{ select(1) }}

  • ( i )
  • ( n-i )
  • ( n-i+1 )
  • 不确定
  1. 使用分治法求解不需要满足的条件是( )

{{ select(1) }}

  • 子问题必须是一样的
  • 子问题不能够重复
  • 子问题的解可以合并
  • 原问题和子问题使用相同的方法解
  1. 如图,在5×7的方格表中有多少个形状为 的图形?

{{ select(1) }}

  • 42
  • 15
  • 76
  • 20
  1. 堆的形状是一棵( )

{{ select(1) }}

  • 二叉排序树
  • 满二叉树
  • 完全二叉树
  • 平衡二叉树
  1. 围着一张圆桌给3名男生,6名女生安排座位,座位没有编号。如果两名男生之间恰有两名女生,共有多少种安排座位的方法( )

{{ select(1) }}

  • 392
  • 1440
  • 2160
  • 2880
  1. 100以内的质数有( )个。

{{ select(1) }}

  • 25
  • 26
  • 27
  • 28
  1. 一盒围棋子,4个4个数多3个,6个6个数多5个,15个15个数多14个,棋子在150~200个,棋子共几个?

{{ select(1) }}

  • 167
  • 179
  • 194
  • 以上都不对
  1. 数据结构中,“先进先出”是( )结构的特征。

{{ select(1) }}

  • 队列
  • 线性表
  1. 右图所示二叉树的中序序列是( )

{{ select(1) }}

  • DHEBAFJCG
  • DHEBAFJICG
  • DBHEAFCJIG
  • DBHEAFJICG
  1. 表达式的后缀表达式 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;
}

判断题

  1. 输出的结果为三位数。( )
  1. 将第5行的 <= 改为 < 则输出结果不变。( )
  1. 将第13行true 改为 1 ,程序运行结果不会改变()
  1. 将第15行删除,结果不会改变。( )

选择题

  1. 如果输入2和12,则输出结果为多少

    • 4
    • 96
    • 096
    • 4096
  2. (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;
}

判断题

  1. 上述代码中将第29行 == 修改为 >=,输出结果一定不变。( )
  1. 上述代码中,将第29、30行删除,输出结果也一定相同。( )
  1. 上述代码中,输入的 k 值可以大于 n。( )
  1. 上述代码中,输入的 m 值可以大于 n。( )

选择题

  1. 当输入为:12 3 8,输出为( )
  • 1
  • 3
  • 7
  • 9
  1. (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;
}

判断题

  1. 数组 arr 的值可以为负数。( )
  1. 若第31行代码为 int arr[10] = {1, 3, 7, 5, 9, 10, 16, 46, 88, 91},输出结果是一样的。( )
  1. 数组数值越大,排序效率越低。( )
  1. 当数组数据量越大时,和顺序查找相比优势越明显。( )

选择题

  1. (4分)程序输出结果为( )
  • 4
  • 5
  • 6
  • 7
  1. (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;
}

填空题

  1. ①处应填( )

    • int x
    • float x
    • double x
    • long long x
  2. ②处应填( )

    • x
    • y
    • mid
    • en
  3. ③处应填( )

    • x + y
    • y
    • st + en
    • en
  4. ④处应填( )

    • num < 1
    • num < 2
    • num < 3
    • num < 4
  5. ⑤处应填( )

    • f(x) * f(y)
    • x
    • mid(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;
}

填空题

  1. ①处应填( )

    • i < n
    • i <= n
    • i < m
    • i <= m
  2. ②处应填( )

    • j < n
    • j <= n
    • j < m
    • j <= m
  3. ③处应填( )

    • a[mp[j].u] + mp[j].w
    • a[mp[j].v] + mp[j].w
    • a[mp[i].u] + mp[i].w
    • a[mp[i].v] + mp[i].w
  4. ④处应填( )

    • k = 0
    • k = 1
    • k = -1
    • k = 2
  5. ⑤处应填( )

    • mp[i].v
    • a[i]
    • mp[i].u
    • mp[a[i]].u