试卷 洛谷 2021 LGR 第一轮 SCP 初赛模拟试题
洛谷 2021 LGR 第一轮 SCP 初赛模拟试题
选择题
第 1 题    单选题

以补码存储的 8 位有符号整数 10110111 的十进制表示为 ( )。

A.

-73

B.

184

C.

72

D.

-72

第 2 题    单选题

1946 年,( )提出了存储程序原理,奠定了现代电子计算机基本结构,开创了程序设计的新时代。

A.

艾伦·麦席森·图灵(Alan Mathison Turing)

B.

约翰·冯·诺依曼(John von Neumann)

C.

克劳德·艾尔伍德·香农(Claude Elwood Shannon)

D.

罗伯特·塔扬(Robert Tarjan)

第 3 题    单选题

有 4 个结点和 4 条边的有标号简单无向图的数量是 ( )。

A.

15

B.

16

C.

6

D.

4

第 4 题    单选题

以下排序算法中最好情况下时间复杂度与最坏情况下时间复杂度相同的是 ( )。

A.

选择排序

B.

冒泡排序

C.

插入排序

D.

快速排序

第 5 题    单选题

在一条长度为 的线段上随机取一个点,再在以原线段的左端点和取的 该点为端点的线段上随机取一个点,则以取的两个点为端点的线段的期望 长度是( )。


A.

1/2

B.

1/3

C.

1/4

D.

2/3

第 6 题    单选题

假设某算法的计算时间表示为递推关系式 𝑇(𝑛) = 3𝑇 (n/2) + Θ(𝑛)𝑇(1) = Θ(1),则算法的时间复杂度为 ( )

A.

Θ(𝑛)

B.

Θ(𝑛log3)

C.

Θ(𝑛 log 𝑛)

D.

Θ(𝑛loglog 𝑛)

第 7 题    单选题

设 x=true,y=false,z=true。以下逻辑运算表达式值为true的是( )。

A.

(¬𝑥∨𝑦)∧𝑧

B.

(𝑦∧𝑧)∨(𝑥∧𝑦)

C.

(𝑥∧𝑦)∨𝑧

D.

(𝑥∧𝑧)∧𝑦

第 8 题    单选题

有 5 个从 1 到 5 标号的小球和 5 个同样标号的盒子,现将小球随机放 入盒子,每个盒子仅放 1 个小球,问每个盒子中的小球都与盒子标号不同 的概率是( )。

A.

24/625

B.

7/20

C.

43/120

D.

11/30

第 9 题    单选题

前缀表达式*+a b+c d的中缀形式是( )。

A.

(a + b) * (c + d)

B.

+ b * c + d

C.

a * b + c * d

D.

(d + c) * (b + a)

第 10 题    单选题

下列算法中,没有运用分治思想的一项是 ( )。

A.

归并排序算法

B.

求二叉树的前序遍历

C.

快速排序算法

D.

求二叉树的层次遍历

第 11 题    单选题

具有 个顶点,条边的连通图采用邻接矩阵存储结构,进行深度优先遍历运算的时间复杂度为( )。

A.

Θ(𝑛3)

B.

Θ(𝑛2)

C.

Θ(𝑛 + 𝑚)

D.

Θ(𝑚2)

第 12 题    单选题

对一个 个顶点,条边的带正权有向简单图使用 Dijkstra 算法计算 单源最短路时,如果再使用一个可以在 Θ(log n) 时间复杂度内查询堆内最

小值、在 Θ(𝑛) 时间复杂度内合并两个堆、在 Θ(1) 时间复杂度内将堆内 一个元素变小、在 Θ(log𝑛) 时间复杂度内弹出堆内最小值的堆优化

Dijkstra 算法,则整个 Dijkstra 算法的时间复杂度为 ( )。

A.

Θ(𝑛𝑛 + 𝑚 log 𝑛)

B.

Θ((𝑛 + 𝑚) log 𝑛)

C.

Θ(𝑚+𝑛log𝑛)

D.

Θ(𝑚𝑛 + 𝑛 log 𝑛)

第 13 题    单选题

链接器的功能是 ( )。

A.

把源代码转换成特定硬件平台的机器指令

B.

把机器指令组合成完整的可执行程序

C.

把源代码转换成可执行程序

D.

把高级语言翻译成低级语言

第 14 题    单选题

现有一段 24 分钟的视频文件,它的帧率是 30Hz,分辨率是 1920×1080, 每帧图像都是 32 位真彩色图像,使用的视频编码算法达到了 25% 的压 缩率。则这个视频文件占用的存储空间大小约是( )。

A.

668GiB

B.

334GiB

C.

85GiB

D.

500GiB

第 15 题    单选题

在计算机非专业级别软件能力认证 CSP-S 进行时,下列行为中被允许的 是( )。

A.

使用 SSH 协议远程登录其它计算机以获取试题等文件

B.

写程序在评测环境中修改输入文件

C.

使用 U 盘拷贝题目及下发文件或自己的代码供赛后复盘

D.

通过枚举输入文件的可能情况获得答案并写入源代码

阅读程序
第 16-21 题    组合题

阅读程序:

#include <cstdio>
#include <cstring>
using namespace std;
char s[10000];
int cnt[26];
int main() {
    scanf("%s", s);
    for (int i = 0; i < strlen(s); ++i) {
        if (cnt[s[i] - 'a'] <= 50) {
            s[strlen(s)] = s[i];
        }
        ++cnt[s[i] - 'a'];
    }
    printf("%s\n", s);
    return 0;
}

假设设初始时输入的字符串长度不超过 500,且不是空串。完成下面的判 断题和单选题:

第16题 判断

将程序第11行中的“++i”改为“i++”,程序运行结果不会改变( )

A.
正确
B.
错误
第17题 判断

将程序第11行改为“for(int i=0,len=strlen(s);i<len;++i)”,程序的运行结果不会改变,同时程序的运行效率将得到提升( )

A.
正确
B.
错误
第18题 判断

对于任意一个出现了a到z中所有的字符、且各字符出现的次数不小于50 的字符串 b,总存在一个字符串 a,使得将字符串 a 输入程序后的运 行结果为字符串b。( )

A.
正确
B.
错误
第19题 判断

程序的输出字符串长度一定不小于1300(注:1300=50×26)。( )


A.
正确
B.
错误
第20题 单选

设输入字符串长度为x(1≤x≤500),输出字符串长度为y,则关于x和y的大小关系正确的是( )。

A.

对于全部的输入字符串,都有x=y。

B.

对于全部的输入字符串,都有x<y。

C.

存在一部分输入字符串,使得 x=y;也存在一部分输入字符串,使得x<y;但是不存在 x>y 的情况。

D.

存在一部分输入字符串,使得 x=y;也存在一部分输入字符串,使得x>y;还存在一部分输入字符串,使得 x<y。

第21题 单选

设字符串w为abcd...z,即从a到z在w中依次出现一次, 共 26 个字符。若输入为 w 重复出现两次的结果(即abcdefg...zabcdefg...z,则输出结果为( )。

A.

w重复出现50次的结果。

B.

w重复出现51次的结果。

C.

w重复出现52次的结果。

D.

w重复出现53次的结果。

第 22-27 题    组合题

阅读程序:

#include <cstdio>
const int N = 5010;
const int M = 20010;
const int inf = 1073741823;
int e, bg[N], nx[M], to[M], wt[M];
inline void link(int u, int v, int w) {
    to[++e] = v;
    nx[e] = bg[u];
    wt[e] = w;
    bg[u] = e;
}
int n, m, u, v, w;
int f[N], h[N << 1];
void update(int x, int y) {
    x += n - 1;
    for (h[x] = y; x; x >>= 1)
        h[x >> 1] = f[h[x]] < f[h[x^1]] ? h[x] : h[x^1];
}
int main() {
    scanf("%d%d", &n, &m);
    for (int i = 0; i != m; ++i) {
        scanf("%d%d%d", &u, &v, &w);
        link(u, v, w);
    }
int nn = n << 1;
for (int i = 1; i <= n; ++i) {
    for (int j = 1; j != nn; ++j)
        h[j] = 0;
    for (int j = 0; j <= n; ++j)
        f[j] = inf;
    f[i] = 0;
    update(i, i);
    for (int j = i; true; j = h[1]) {
        if (f[j] == inf) break;
        for (int k = bg[j]; k; k = nx[k]) {
            if (f[j] + wt[k] < f[to[k]]) {
                f[to[k]] = f[j] + wt[k];
                update(to[k], to[k]);
            }
        }
        update(j, 0);
     }
    for (int j = 1; j <= n; ++j)
        printf("%d%c", f[j], "\n "[j != n]);
    }
    return 0;
}

以下程序的输入是一张带边权的有向图,完成下面的判断题和单选题:

第22题 判断

将程序中所有的 “!=” 替换为 “<”,程序将仍然正常运行且输出的结果不会改变。 ( )

A.
正确
B.
错误
第23题 判断

为了保证程序正常运行,输入的边数必须不大于 2 × 104。 ( )

A.
正确
B.
错误
第24题 判断

程序的输出是一个 n×n 的整数矩阵。 ( )

A.
正确
B.
错误
第25题 判断

将程序第 34 行的 “j=0” 替换为 “j=1”,程序将仍然正常运行且输 出的结果不会改变。 ( )

A.
正确
B.
错误
第26题 单选

当输入的图中所有边的边权均为一个相同的正整数,且有∑ 𝑤𝑖 < 1073741823 时,“update” 函数被调用的次数为( )。

A.

Θ(𝑛2)

B.

Θ(𝑛𝑚)

C.

Θ(𝑛+ 𝑛𝑚)

D.

Θ(𝑛min(𝑛,𝑚))

第27题 单选

当输入的边权均为正整数时,程序在最坏情况下的时间复杂度为( )。

A.

Θ(𝑛3)。

B.

Θ(𝑛log 𝑛 + 𝑛𝑚)

C.

Θ(𝑛𝑚 log 𝑛)

D.

Θ(𝑛2𝑚)

第 28-33 题    组合题

阅读程序:

#include <bits/stdc++.h>
using namespace std;
#define N 105
#define INF 1e9
int dis1[N][N], dis2[N][N];
int mp[N][N], n, m;
void fun1(int dis[N][N]) {
    static bool vis[N];
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            dis[i][j] = mp[i][j];
        } 
    }
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) vis[j] = 0;
          for (int k = 1; k <= n; k++) {
            int now = 0;
            for (int j = 1; j <= n; j++) {
                if (!vis[j] && (!now || dis[i][now] > dis[i][j])) now = j;
    }
    vis[now] = 1;
    for (int j = 1; j <= n; j++) {
        if(!vis[j]&&dis[i][j] > dis[i][now]+mp[now][j]){
           dis[i][j] = dis[i][now] + mp[now][j];
                }
            }
        }
    }
}
void fun2(int dis[N][N]) {
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            dis[i][j] = mp[i][j];
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
          for (int k = 1; k <= n; k++) {
            dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
            }
        }
    }
}
int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (i == j) mp[i][j] = 0;
            else mp[i][j] = INF;
        }
    }
for (int i = 1; i <= m; i++) {
  int u, v, w;
  cin >> u >> v >> w;
  mp[u][v] = w;
}
fun1(dis1);
fun2(dis2);
int ans = 0;
for (int i = 1; i <= n; i++) {
    for(intj=1;j<=n;j++){
        if (dis1[i][j] != dis2[i][j])
            ans++;
        }
    }
cout << ans << endl;
return 0;
}

以下程序的输入数据满足 𝟏 ≤ 𝒏 ≤ 𝟏𝟎𝟎, 𝟏 ≤ 𝒎 ≤ 𝒏(𝒏−𝟏,且只保证不存在 𝟐重边,即不存在 (𝒖𝒊, 𝒗𝒊) = (𝒖𝒋, 𝒗𝒋) (𝒊 ≠ 𝒋),边权 𝒘𝒊 ∈ [𝟏, 𝟏𝟎𝟔。如果 到 v不可达,则认为距离为 INF 。完成下面的判断题和单选题:

第28题 判断

该代码的 dis1[i][j] 不一定是 i 到 j 的最短路。( )

A.
正确
B.
错误
第29题 判断

输出可能为 1 。( )

A.
正确
B.
错误
第30题 判断

将第19行的k<=n修改为k<n,不影响答案。( )

A.
正确
B.
错误
第31题 判断

对于稀疏图(n,m 不同阶),fun1() 对于单个 i 求 dis[i][j] (1≤𝑗≤𝑛) ,最快可以做到Θ((𝑛+𝑚)log𝑚) 。( )

A.
正确
B.
错误
第32题 单选

对于以下的输入数据,输出结果为( )。

5 8 

3 2 2 

2 4 2 

1 4 3 

3 1 2 

4 3 3 

5 2 3 

1 5 1 

1 2 2

A.

2

B.

3

C.

4

D.

5

第33题 单选

若输入数据 “n=5” ,输出 ans 的最大可能值为 ( )。

A.

4

B.

5

C.

6

D.

7

完善程序
第 34-38 题    组合题

(装备穿戴问题)有 n 件装备,穿戴第 i 件装备需要玩家的力量值至少为 𝑎𝑖,穿戴该装备后会让玩家的力量值增加 𝑏𝑖。现在请问玩家的初始力量 值最小是多少,才能以某种顺序穿戴上所有的装备? 输入:第一行是一个整数 n(1 ≤ 𝑛 ≤ 103);第二行有 n 个整数,第 i 个 整数表示 𝑎𝑖(0 ≤ 𝑎𝑖 ≤ 109);第三行有 n 个整数,第 i 个整数表示 𝑏𝑖 ( 0 ≤ 𝑏 𝑖 ≤ 1 0 6 )。 提示:使用二分+贪心的方法解决这个问题,先对装备按顺序进行排序,然 后二分答案,并贪心地进行选择。

试补全程序。

#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1005;
int n;
int a[maxn], b[maxn], c[maxn];
bool Comp(const int &x, const int &y) {
// 你可以简单地认为括号内的内容等价于 (int x, int y)
    return 1;
}
bool check(int x) {
    for(int i = 1; i < =n; ++i){
    int u = c[i];
    if (2) {
        x += b[u];
    } else {
        return false;
        }
    }
    return true;
}
int main() {
    scanf("%d", &n);
    for (int i = 1; i <=n; ++i) scanf("%d", a + i);
    for (int i = 1; i <=n; ++i) scanf("%d", b + i);
    for (int i = 1; i <=n; ++i) c[i] = i;
    sort(c + 1, c + 1 + n, Comp);
    int ans = 1145141919;
    for (int l=1, r=ans, mid=(l+r)/2; 3; mid=(l+r)/2)
        if (check(mid)) {
            ans = mid;
            4;
        } else {
            5;
        }
    printf("%d\n", ans);
    return 0;
}
第34题 单选

1处应填( )。

A.

a[x] > a[y]

B.

a[x] < a[y]

C.

a[x] >= a[y]

D.

a[x] <= a[y]

第35题 单选

2处应填( )。

A.

x < a[i]

B.

x<a[u]

C.

x >= a[i]

D.

x>=a[u]

第36题 单选

3处应填( )。

A.

l<r

B.

l<=r

C.

check(l)

D.

check(r)

第37题 单选

4处应填( )。

A.

r = mid – 1

B.

r=mid+ 1

C.

l = mid – 1

D.

l=mid+ 1

第38题 单选

5处应填( )。

A.

r = mid – 1

B.

r=mid+ 1

C.

l = mid – 1

D.

l=mid+ 1

第 39-43 题    组合题

(打音游)小 最近喜欢上了一款音游,并希望在结算时得到特定分数, 例如 1919810 分。这款音游的得分计算方式如下:一共有 个音符,将 一千万(107)分平分给所有音符得到基础得分 𝑥 = 107/n(保留非整数部 分),其中有 个音符根据是否击中可以获得 x+1 分或者 分,剩下的 n-m 个音符根据击中精度可以获得 x+1xx/2分中的一个,最后将总 得分向下取整即可得到最终得分。

给定 n,m,小 想知道他可以得到多少种不同的分数。 输入为两个非负整数,分别表示 n,m;满足1 ≤ 𝑛 ≤ 1070 ≤ 𝑚 ≤ 𝑛。输出 为一个正整数表示答案。试补全程序。

#include<iostream>
using namespace std;
int main()
{
    int n,m;
    cin>>n>>m;
    if(m==n){
        cout<<1<<end1;
        return o;
    }
    long long m=1000000;
    int ans=2;
    int lst=0;
    for(int i=1;i<=n ++1 ){
        for(int j=1; j>=0; --j){
            int lower=max(0,3);
            int upper=i-j;
            int base=4;
            ans+=upper-lower+1;
            if(lower+base<=lst) ans-=lst-(lower+base)+1;
                lst=5;
            }
        }
    cout<<ans<<endl;
    return 0;
}
第39题 单选

1处应填

A.

-1

B.

n-1

C.

n

D.

n+1

第40题 单选

2处应填

A.

-1

B.

0

C.

1

D.

n

第41题 单选

3处应填

A.

i–(n-m)-1

B.

i–(n-m)-j

C.

i–(n-m)

D.

i–(n-m)+j

第42题 单选

4处应填

A.

(2*i+j) * M / (2*n)

B.

(2*i-j) * M / (2*n)

C.

 i * M / n +j * M / (2*n)

D.

 i * M / n -j * M / (2*n)

第43题 单选

5处应填

A.

base + upper

B.

base + upper + 1

C.

base + lower


D.

base + lower + 1

答题卡
选择题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
阅读程序
完善程序
题目总数:20
总分数:100
时间:120分钟