#ACSP1007. cspj-模拟题7

cspj-模拟题7

普及组CSP-J2024 初赛模拟卷7

一、单项选择题(共 15题,每题2分,共计30分;每题有且仅有一个正确选项)

  1. 在标准 ASCII码表中, 字符'4'的 ASCII 码值用二进制表示是({{ select(1) }})。
  • 00000100
  • 00110100
  • 00110101
  • 00110011
  1. 关于树这种数据结构的下述说法,正确的是({{ select(2) }})。
  • 一个有m个顶点和m-1 条边的图就是树
  • 树中的任意两个顶点之间有且只有一条简单路径
  • 树中有的结点可能构成环
  • 若树根层次为1,则对应高度为n的二叉树最多有2n个结点
  1. 以下哪个不是输入设备?({{ select(3) }})。
  • 绘图仪
  • 触摸屏
  • 扫描仪
  • 麦克风
  1. 当a=3, b=2, c=1时, 执行以下程序段后c=({{ select(4) }})。
     if(a>b)
         a=b;
     if(b>c)
         b=c;
     else
         c=b;
     c=a--;
    
  • 0
  • 1
  • 2
  • 3

5.学生在大学选修某些课程时需要先上其他的前置课程,所有课程和课程间的先修关系构成一个有向图G,有向边<M,N>表示课程M是课程N的先修课,则要找到某门课程L的全部先修课,下面哪种算法不可行?({{ select(5) }})。

  • Dijkstra
  • BFS
  • DFS
  • BFS+DFS

6.下列对语句 freopen("function.in", "r", stdin);的分析中正确的是({{ select(6) }})。

  • freopen 是文件名
  • function.in是重定向函数名
  • r代表重定向为“写”方式
  • 语句将 cin重定向到文件 function.in

7.Windows 下可执行文件的扩展名是({{ select(7) }})。

  • com
  • exe
  • cpp
  • dll

8.[x]补码=10011000, 其原码为({{ select(8) }})。

  • 011001111
  • 11101000
  • 11100110
  • 01100101

9.下面有关布尔类型的函数的说法,正确的是({{ select(9) }})。

  • 布尔类型函数只能返回0和1两个值
  • 布尔类型函数可以返回负数
  • 布尔类型函数必须有参数传递
  • 布尔类型函数可以返回 NULL

10.下面有关格雷码的说法,错误的是({{ select(10) }})。

  • 在格雷码中,任意两个相邻的代码只有一位二进制数不同
  • 格雷码是一种可靠性编码
  • 在格雷码中,最大数和最小数只有一位二进制数不同
  • 格雷码是一种唯一性编码

11.现在有5个整数-2,-1,0,1,2,. 从中任意挑选两个整数,它们的和为0的概率是多少?({{ select(11) }})。

  • 1/6
  • 1/4
  • 1/5
  • 1/10

12.小明走楼梯,每次上台阶能跨1或2 级。下面是走到第N步台阶的C++实现代码。该段代码采用的是({{ select(12) }})算法。

  • 递推
  • 贪心
  • 递归
  • 分治
    int UpStairs(int N)
    {
        if(N==1)
            return 1;
        else if(N==2)
            return 2;
        else
            return UpStairs(N-2) + UpStairs(N-1);
    }
    

13.某内容中仅会出现A,B,C,D,E,F,G, 对应的出现概率分别为0.40,0.30,0.15,0.05,0.04,0.03, 0.03, 如下图所示。按照哈夫曼编码规则, 假设B的编码为11, 则 D 的编码为({{ select(13) }})。

  • 10010
  • 10011
  • 10111
  • 10001

14.某学习小组有5名男生和3名女生,从中选3名男生和1名女生参加3项竞赛活动,每项活动至少有 1人参加,则参赛方法有({{ select(14) }})种。

  • 960
  • 1080
  • 2160
  • 540

15.简单无向连通图G有18条边,且每个顶点的度数为2,则图G有({{ select(15) }})个顶点。

  • 81
  • 17
  • 18
  • 64

二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填✔,错误填×;除特殊说明外,判断题每题1.5分,选择题每题3分,共计40分)

(1)

#include<bits/stdc++. h>
using namespace std;
int a[101000];
int p(int deep){
    return pow(2, deep);
}
int main(){
    int n, mindeep=1,i=2, deep=2;
    scanf("%d %d",&n,δa[1]);
    long long maxx = a[1];
    for(i=2;i<=n;i++)
        scanf("%d",&a[i]);
    i=2;
    while(i<=n){
        long long sum=0;
        for(;i<p(deep)&&i<=n;i++)
           sum+=a[i];
        if(sum > maxx)
            maxx = sum, mindeep = deep;
        deep++;
    }
    cout << mindeep;
    return 0;
}

判断题

16.将第8行中的i=2改为i,程序的运行结果不会改变。({{ select(16) }})

  • 正确
  • 错误

17.如果输入都是正整数, 那么将第 10行中的a[1]替换成a[0], 将第13 行中的 i=2替换成 i=1,程序的运行结果不会改变。({{ select(17) }})

  • 正确
  • 错误

18.将第 15 行中的 long long sum=0;替换成 long long sum;, 程序的运行结果不会改变。({{ select(18) }})

  • 正确
  • 错误

19.将第18行中的if(sum > maxx)替换成if(sum >= maxx), 程序的运行结果不会改变。({{ select(19) }})

  • 正确
  • 错误

选择题

20.若输入为 7 1 6 5 4 3 2 1, 则输出为({{ select(20) }})。

  • 11
  • 2
  • 10
  • 3

21.若输入为15 9 4 5 3 3 3 2 1 2 1 1 1 1 1 1 1 1 1 1 1, 则输出为({{ select(21) }})。

  • 4
  • 3
  • 2
  • 1

(2)

#include <bits/stdc++. h>
using namespace std;
bool judge(int a)
{
    while(a!=0)
    {
       int t = a%10;
       if(t==2 || t==4)
          return 0;
       a = a/10;
    }
    return 1;
}
int main(void)
{
   int sum=0,n;
    cin>>n;
    for(int i=1;i<n/3+1;i++)
       if(judge(i))
           for(int j=i+1;j<n-i-j;j++)
               if(judge(j) && judge(n-i-j))
              {
                   sum++;
                }
    cout<<sum;
    return 0;
}

判断题

22.将 judge函数和main函数的位置调换一下,程序的运行不受影响。({{ select(22) }})

  • 正确
  • 错误

23.将第3行中的bool改为 int,程序的运行结果不会改变。({{ select(23) }})

  • 正确
  • 错误

24.该程序运行的时间复杂度是 O(nlogn)。({{ select(24) }})

  • 正确
  • 错误

25.将第20行中的j=i+1改为 j=1, 程序的运行结果不会改变。({{ select(25) }})

  • 正确
  • 错误

选择题

26.若输入 n = 24, 则程序的输出为({{ select(26) }})。

  • 15
  • 16
  • 14
  • 13

27.若程序的输出为20,则程序的输入可能为({{ select(27) }})。

  • 38
  • 41
  • 40
  • 42

(3)

#include<bits/stdc++. h>
using namespace std;
typedef long long long LL;
int a[100005],b[100005],c[100005];
int small(int n, int a[], int key)
{
    int left=1, right=n;
    while(left < right)
    {
       int mid = (left+right+1)/2;
       if(a[mid] < key)
          left = mid;
       else
          right = mid - 1;
    }
    return left;
}
int big(int n, int c[], int key)
{
    int left=1, right=n;
    while(left < right)
    {
       int mid = (left+right)/2;
       if(c[mid] > key)
          right = mid;
       else
          left = mid + 1;
    }
    return left;
}
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;++i)
       cin>>a[i];
    for(int i=1;i<=n;++i)
       cin>>b[i];
    for(int i=1;i<=n;++i)
       cin>>c[i];
    sort(a+1,a+n+1);
    sort(b+1,b+n+1);
    sort(c+1,c+n+1);
    LL count = 0;
    for(int i=1;i<=n;i++)
    {
       int key = b[i];
       LL wa = small(n,a, key);
       LL wc = big(n,c, key);
       if(a[wa] < key && c[wc] > key)
          count += wa*(n+1-wc);
    }
    cout<<count<<endl;
    return 0;
}

判断题

28.若将第8行中的while(left < right)替换为while(left <= right), 程序的运行结果不会改变。({{ select(28) }})

  • 正确
  • 错误

29.若将第10行中的(left+right+1)/2替换为 left+right+1>>1, 程序的运行结果不会改变。({{ select(29) }})

  • 正确
  • 错误

30.若将第23行中的(left+right)/2替换为left+(right-left)/2,程序的运行结果不会改变。({{ select(30) }})

  • 正确
  • 错误

31.若将第48行中的small(n,a, key)替换为(lower bound(a+1,a+n+1,b[i])-a)-1,程序的运行结果不会改变。({{ select(31) }})

  • 正确
  • 错误

选择题

32.本程序运行的时间复杂度是({{ select(32) }})。

  • O(1)
  • O(n)
  • O(n²)
  • O(nlogn)

33.若输入3 1 1 1 1 2 2 2 3 3, 那么输出结果是({{ select(33) }})。

  • 27
  • 21
  • 18
  • 15

34.(4分)若输入3 1 2 3 3 4 5 5 6 7, 那么输出结果是({{ select(34) }})。

  • 27
  • 21
  • 18
  • 15

三、完善程序(单选题,每小题3分,共计30分)

(1) 输入一个十进制正整数 nn,然后将 nn 转换为二进制数,最后统计二进制数的各位数字,看看一共有多少位为1,然后打印出总数。

输入格式: 第1行输入十进制正整数nn

输出格式: 输出一个整数,表示十进制正整数n转换成的二进制数中有多少位为1。

输入样例:

127

输出样例:

7

样例说明: 十进制数127转换为二进制数 111111,二进制位一共有7个1,所以输出7。

#include<bits/stdc++. h>
using namespace std;
int a[33], cnt;

int main()
{
    int n, sum,x;
    cin>>n;
    cnt=0;
    ①;
    while(x>0)
    {
      a[②]=x%2;
      ③;
    }
    sum=0;
    for(int i=1;④;i++)
    if(a[i]==1)
      ⑤;
    cout<<sum<<endl;
    return 0;
}

35.①处应填({{ select(35) }})。

  • x=n
  • x=1
  • x=0
  • x=n-1

36.②处应填({{ select(36) }})。

  • --cnt
  • ++cnt
  • cnt--
  • cnt

37.③处应填({{ select(37) }})。

  • x/=2
  • n++
  • x++
  • n--

38.④处应填({{ select(38) }})。

  • i<cnt
  • i<cnt/2
  • i<=cnt
  • i<=cnt/2

39.⑤处应填({{ select(39) }})。

  • sum--
  • sum=x
  • sum=0
  • sum++

(2) 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D₁、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D₂、出发点每升汽油的价格P、沿途加油站数N(N可以为零)、加油站 i 离出发点的距离 D₁、每升汽油的价格。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出 No Solution。 输入格式: 第1行, D₁,C,D₂,P,N。接下来有N行。第i+1行, 两个数字, 即加油站i离出发点的距离D₁和每升汽油的价格P₁。 输出格式: 所需的最少费用,计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出 No Solution。 输入样例:

275.6  11.9  27.4  2.8  2
102.0  2.9
220.0  2.2

输出样例:

26.95

说明/提示:N≤6, 其余数字≤500。

#include<bits/stdc++. h>
using namespace std;
const int MAXN = 100;
int N;
double D[MAXN], P[MAXN], D1, C, per, req;
int main(){
    cin>>D1>>C>>per>>P[0]>>N;
    D1 /= per;
    for(int i=1; i<=N; i++)  {
        cin>>D[i]>>P[i];
          D[i] /= per;
    }
    D[0] = 0;
    ①;
    P[N+1] = 0;
    double cur = 0, ans = 0;
    for(int i=0; i<=N; i++)            {
        int ni = N+1;
        for(int j=i+1; j<= N+1; j++) {
           if(P[j] <= P[i]) {
                ni = j;
                break;
            }
        }
        ②;
        if(req > C)
            ③;
        if(req > cur) {
            ans += (req - cur) * P[i];
            cur = req;
        }
        ④;
        if(cur < 0)
            break;
    }
    if(cur < 0)
        cout<<"No Solution"<<endl;
    else
    ⑤;
    return 0;
}

40.①处应填({{ select(40) }})。

  • D[N] = D1
  • D[N+1] = D1
  • D[1] = D1
  • D[N-1] = D1

41.②处应填({{ select(41) }})。

  • req = D[i] - D[i-1]
  • req = D[i+1] - D[i]
  • req = D[ni] + D[i]
  • req = D[ni] - D[i]

42.③处应填({{ select(42) }})。

  • req = C
  • req -= C
  • req += C
  • req %= C

43.④处应填({{ select(43) }})。

  • cur += D[i+1] - D[i]
  • cur -= D[i+1] - D[i]
  • cur += D[ni] - D[i]
  • cur -= D[ni] - D[i]

44.⑤处应填({{ select(44) }})。

  • printf("%.2d\n", ans)
  • printf("%.2lf\n", ans)
  • cout<<fixed<<setprecision(2)<<ans<<endl
  • cout<<fixed<<setprecision(3)<<ans<<endl