#YHCSPJ0010. CSP-J模拟卷10

CSP-J模拟卷10

选择题

  1. (2分)以下逻辑表达式的值恒为真的是()。{{ select(1) }}
  • P ∨ (¬P ∧ Q) ∨ (¬P ∧ ¬Q)
  • Q ∨ (¬P ∧ Q) ∨ (P ∧ ¬Q)
  • P ∨ Q ∨ (P ∧ ¬Q) ∨ (¬P ∧ Q)
  • P ∨ ¬Q ∨ (P ∧ ¬Q) ∨ (¬P ∧ ¬Q)
  1. (2分)在8位二进制补码中,10101011表示的数是十进制下的()。{{ select(2) }}
  • 43
  • -85
  • -43
  • -84
  1. (2分)二进制数11.01在十进制下是()。{{ select(3) }}
  • 3.25
  • 4.125
  • 6.25
  • 11.125
  1. (2分)把64位非零浮点数强制转换成32位浮点数后,不可能()。{{ select(4) }}
  • 大于原数
  • 小于原数
  • 等于原数
  • 与原数符号相反
  1. (2分)提出“存储程序”的计算机工作原理的是()。{{ select(5) }}
  • 克劳德·香农
  • 戈登·摩尔
  • 查尔斯·巴贝奇
  • 冯·诺依曼
  1. (2分)开始时计算机处于小写输入状态,小老鼠按CapsLock、A、S、D的顺序循环按键,屏幕输出的第81个字符是()。{{ select(6) }}
  • A
  • S
  • D
  • a
  1. (2分)字符串“AAABBBCCC”共有()个不同的非空子串。{{ select(7) }}
  • 3
  • 12
  • 36
  • 45
  1. (2分)广度优先搜索时需要用到的数据结构是()。{{ select(8) }}
  • 链表
  • 队列
  • 散列表
  1. (2分)在搜索引擎中对关键词加双引号表示()。{{ select(9) }}
  • 排除关键词
  • 分解关键词
  • 精确搜索
  • 站内搜索
  1. (2分)将(2, 6, 10, 17)存储到0~10的哈希表中,哈希函数()不会产生冲突。{{ select(10) }}
  • x mod 11
  • x² mod 11
  • (2x) mod 11
  • ⌊sqrt(x)⌋ mod 11
  1. (2分)调用solve(7)的返回结果为()。{{ select(11) }}
solve(n) {
    if n<=1 return 1
    else if n>=5 return n*solve(n-2)
    else return n*solve(n-1)
}
  • 105
  • 840
  • 210
  • 420
  1. (2分)在含N个不同数字的数组中同时找最大与最小数,最坏情况下至少需要()次比较。{{ select(12) }}
  • ⌈3N/2⌉−2
  • ⌊N/2⌋+2
  • 2N−2
  • 2N−4
  1. (2分)一家四口至少两人生日同月份的概率是()。{{ select(13) }}
  • 1/12
  • 1/144
  • 41/96
  • 3/4
  1. (2分)二叉树前序遍历为ABCDEFG,后序遍历为CBFEGDA,根结点左子树的结点个数可能是()。{{ select(14) }}
  • 2
  • 3
  • 4
  • 5
  1. (2分)2017年10月1日是星期日,1999年10月1日是()。{{ select(15) }}
  • 星期三
  • 星期日
  • 星期五
  • 星期二

阅读理解1(12分)

#include <cstdlib>
#include <iostream>
using namespace std;

char encoder[26] = {'C','S','P',0};
char decoder[26];
string st;

int main() {
    int k = 0;
    for (int i = 0; i < 26; ++i)
        if (encoder[i] != 0) ++k;
    for (char x = 'A'; x <= 'Z'; ++x) {
        bool flag = true;
        for (int i = 0; i < 26; ++i)
            if (encoder[i] == x) {
                flag = false;
                break;
            }
        if (flag) {
            encoder[k] = x;
            ++k;
        }
    }
    for (int i = 0; i < 26; ++i)
        decoder[encoder[i] - 'A'] = i + 'A';
    cin >> st;
    for (int i = 0; i < st.length(); ++i)
        st[i] = decoder[st[i] - 'A'];
    cout << st;
    return 0;
}

第16题(1.5分)

输入字符串非大写字母可能导致数组越界。(){{ select(16) }}

  • 正确
  • 错误

第17题(1.5分)

输入非空字符串与输出一定不同。(){{ select(17) }}

  • 正确
  • 错误

第18题(1.5分)

第12行i<26改为i<16,运行结果不变。(){{ select(18) }}

  • 正确
  • 错误

第19题(1.5分)

第26行i<26改为i<16,运行结果不变。(){{ select(19) }}

  • 正确
  • 错误

第20题(3分)

输出为"ABC ABC ABC A",正确的是:{{ select(20) }}

  • 输入含S和P
  • 输入含S和B
  • 输入含A和P
  • 输入含A和B

第21题(3分)

输出为"CSPCSPCSPCSP",正确的是:{{ select(21) }}

  • 输入含P和K
  • 输入含J和R
  • 输入含J和K
  • 输入含P和R

阅读理解2(14分)

#include<cstdio>
#include<cstring>
using namespace std;
int n, m;
int f[101][101];
int F[101][101];

int main() {
    scanf("%d%d", &n, &m);
    memset(f, -1, sizeof(f));
    for(int i = 1; i <= m; i++) {
        int u, v, w;
        scanf("%d%d%d", &u, &v, &w);
        f[u][v] = f[v][u] = w;
    }
    for(int k = 1; k <= n; k++)
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= n; j++)
                if(f[i][k] != -1 && f[k][j] != -1)
                    if(f[i][j] == -1 || f[i][j] > f[k][j] + f[i][k])
                        f[i][j] = f[i][k] + f[k][j];
    int ans = 2147483647;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++) {
            for(int x = 1; x <= n; x++)
                for(int y = 1; y <= n; y++)
                    F[x][y] = f[x][y];
            F[i][j] = F[j][i] = 0;
            for(int x = 1; x <= n; x++)
                for(int y = 1; y <= n; y++)
                    if(F[x][y] == -1 || F[x][y] > F[x][i] + F[i][y])
                        F[x][y] = F[x][i] + F[i][y];
            for(int x = 1; x <= n; x++)
                for(int y = 1; y <= n; y++)
                    if(F[x][y] == -1 || F[x][y] > F[x][j] + F[j][y])
                        F[x][y] = F[x][j] + F[j][y];
            int res = 0;
            for(int x = 1; x <= n; x++)
                for(int y = 1; y < x; y++)
                    res += F[x][y];
            ans = min(res, ans);
        }
    printf("%d\n", ans);
    return 0;
}

第22题(2分)

14-16行循环变量调为i、j、k,结果不变。(){{ select(22) }}

  • 正确
  • 错误

第23题(2分)

程序时间复杂度与m无关。(){{ select(23) }}

  • 正确
  • 错误

第24题(2分)

ans初始化为10^7可能无法得到正确结果。(){{ select(24) }}

  • 正确
  • 错误

第25题(2分)

27-30行与31-34行互换,结果不变。(){{ select(25) }}

  • 正确
  • 错误

第26题(3分)

输入4 5,边为1-2(3)、1-3(6)、2-3(4)、2-4(7)、3-4(2),输出:{{ select(26) }}

  • 14
  • 18
  • 21
  • 28

第27题(3分)

程序使用的算法是:{{ select(27) }}

  • Floyd
  • Dijkstra
  • Prim
  • Kruskal

阅读理解3(14分)

#include<iostream>
using namespace std;
const int V=100;
int n,m,ans,e[V][V];
bool visited[V];
void dfs(int x,int len) {
    int i; 
    visited[x]=true; 
    if(len>ans) ans=len; 
    for(i=1;i<=n;i++)
        if((!visited[i])&&(e[x][i]!=-1)) 
            dfs(i,len+e[x][i]); 
    visited[x]=false; 
}
int main() {
    int i,j,a,b,c; 
    cin>>n>>m; 
    for(i=1;i<=n;i++) 
        for(j=1;j<=n;j++) 
            e[i][j]=-1; 
    for(i=1;i<=m;i++) {
        cin>>a>>b>>c; 
        e[a][b]=c; 
        e[b][a]=c; 
    }
    for(i=1;i<=n;i++) 
        visited[i]=false; 
    ans=0; 
    for(i=1;i<=n;i++) 
        dfs(i,0); 
    cout<<ans<<endl; 
    return 0; 
}

第28题(1.5分)

若m=n*(n-1)/2,20-22行初始化可省略。(){{ select(28) }}

  • 正确
  • 错误

第29题(1.5分)

第31行换成“for(i=n;i>=1;i--)”,结果不受影响。(){{ select(29) }}

  • 正确
  • 错误

第30题(3分)

输入4 2,1 2 1,3 4 1,输出:{{ select(30) }}

  • 8
  • 4
  • 2
  • 1

第31题(3分)

输入4 6,各边权1,输出:{{ select(31) }}

  • 1
  • 3
  • 5
  • 7

第32题(3分)

输入4 3,边为1-2(10)、2-3(20)、3-1(30),输出:{{ select(32) }}

  • 30
  • 60
  • 90
  • 120

第33题(3分)

输入4 6,边权10、20、30、40、50、60,输出:{{ select(33) }}

  • 60
  • 100
  • 150
  • 200

编程填空1(15分)

题目描述:封禁xxs

#include<cstdio>
using namespace std;
#define MAXN 300005 
int n, ans=0, a[MAXN], in[MAXN]={0};
bool vis[MAXN]={0}; 

void dfs(int cur, int w) { 
    if(vis[cur])
        return;
    vis[cur]=true; 
    if(w==1) ans++; 
    ①;
    if(②) 
        dfs(a[cur], ③); 
}

int main() { 
    scanf("%d", &n); 
    for(int i=1; i <=n; i++) { 
        scanf("%d", &a[i]);
        in[a[i]]++; 
    } 
    for(int i=1; i <= n; i++) 
        if(!in[i]) ④; 
    for(int i=1; i<=n; i++) 
        if(⑤) dfs(i, 0); 
    printf("%d\n", ans);
    return 0; 
}

第34题(3分)①处应填(){{ select(34) }}

  • a[cur]=cur
  • in[a[cur]]=0
  • in[a[cur]]--
  • in[cur]--

第35题(3分)②处应填(){{ select(35) }}

  • in[a[cur]]!=0 || w==1
  • in[a[cur]]0 || w0
  • in[a[cur]]!=0 || w==0
  • in[a[cur]]0 || w1

第36题(3分)③处应填(){{ select(36) }}

  • 0
  • 1
  • w
  • 1-w

第37题(3分)④处应填(){{ select(37) }}

  • dfs(i, 1)
  • dfs(i, 0)
  • dfs(a[i], 1)
  • dfs(a[i], 0)

第38题(3分)⑤处应填(){{ select(38) }}

  • !in[i]
  • in[i]
  • !vis[i]
  • vis[i]

编程填空2(15分)

题目描述:二叉查找树

#include <iostream>
using namespace std; 
const int SIZE = 100;
const int INFINITE = 1000000;

struct node {
    int left_child, right_child, value;
}; node a[SIZE];

int is_bst(int root, int lower_bound, int upper_bound) {
    int cur;
    if (root == 0)
        return(1);
    cur = a[root].value;
    if ((cur > lower_bound) && (①) && (is_bst(a[root].left_child, lower_bound, cur) == 1) && (is_bst(②, ③, ④) == 1))
        return(1);
    return(0);
}

int main() {
    int i, n; cin >> n;
    for (i = 1; i <= n; i++)
        cin >> a[i].value >> a[i].left_child >> a[i].right_child;
    cout << is_bst(⑤, -INFINITE, INFINITE) << endl;
    return(0);
}

第39题(3分)①处应填(){{ select(39) }}

  • cur < upper_bound
  • cur > upper_bound
  • cur == upper_bound
  • cur != upper_bound

第40题(3分)②处应填(){{ select(40) }}

  • a[root].left_child
  • a[root].right_child
  • lower_bound
  • upper_bound

第41题(3分)③处应填(){{ select(41) }}

  • cur
  • lower_bound
  • upper_bound
  • root

第42题(3分)④处应填(){{ select(42) }}

  • cur
  • lower_bound
  • upper_bound
  • root

第43题(3分)⑤处应填(){{ select(43) }}

  • 0
  • 1
  • n
  • -1