#ACSP1005. cspj-模拟题5

cspj-模拟题5

普及组CSP-J 2024 初赛模拟卷5

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

  1. 十进制数 2024的八进制表示是 ({{ select(1) }})。
  • A.3749
  • B.3750
  • C.3751
  • D.3752
  1. 以下关于计算机协会竞赛的描述正确的是({{ select(2) }})。
  • A. NOI 国家集训队每年产生4名选手代表中国参加IOI
  • B. CSP-J/CSP-S 是 2018年开始举办的
  • C. USACO 晋级白金的选手可以直接参加 NOIP
  • D. ACSL 和 NOIP 都是 CCF 旗下的程序设计赛事
  1. 以下哪个可以用作C++程序中的变量名? ({{ select(3) }})。
  • A. public
  • B. loops
  • C. new
  • D. delete
  1. 以下哪个数据结构不属于线性结构? ({{ select(4) }})。
  • A. 栈
  • B. 数组
  • C. 树
  • D. 链表
  1. 以下哪个属于 STL 函数? ({{ select(5) }})。
  • A. main
  • B. sort
  • C. freepen
  • D. scanf
  1. 小明用递归的方法写了一个斐波那契数列的程序,在这里递归函数经常用到的数据结构是({{ select(6) }})。
  • A. 树
  • B. 栈
  • C. 链表
  • D. 队列
  1. 堆排序程序运行的时间复杂度是 ({{ select(7) }})。
  • A. O(logn)
  • B. O(n)
  • C. O(n²)
  • D. O(nlogn)
  1. 在下列排序算法中,({{ select(8) }})是稳定的排序算法。
  • A.归并排序
  • B.快速排序
  • C.选择排序
  • D.拓扑排序
  1. 一台 32位操作系统的计算机运行C++,下面哪个说法是正确的? ({{ select(9) }})。
  • A. C++语言中的一个 int 类型的变量占8字节
  • B. C++语言中的一个指针类型的变量占4字节
  • C. C++语言中的一个 bool类型的变量占2字节
  • D. C++语言中的一个 double类型的变量占4字节
  1. 设全集I={a,b,c,d,e,f,g,h},集合B∪A={a,b,c,d,e,f},C∩A={c,d,e},~B∩A={a,d},那么集合C∩B∩A为({{ select(10) }})。
  • A.{c,e}
  • B.{d,e}
  • C.{e}
  • D.{c,d,e}
  1. 在不大于19000的正整数中, 与19000互质的正整数有({{ select(11) }}) 个。
  • A.9500
  • B.9498
  • C.7200
  • D.9499
  1. 假设P=true,Q=false,R=true,S=true,逻辑运算表达式P∧Q∨R∧S的值是({{ select(12) }})。
  • A. true
  • B. false
  • C. null
  • D. NIL
  1. 对于二叉树T, 已知其前序遍历序列为1243576, 中序遍历序列为4215736,则其后序遍历序列为({{ select(13) }})。
  • A.4257631
  • B.4275631
  • C.4275361
  • D.4723561
  1. 一个口袋内装有大小相同的7个白球和2个黑球,从口袋中取出3个球,使其中不含黑球,有多少种取法? ({{ select(14) }})。
  • A.32
  • B.35
  • C.24
  • D.56
  1. 在下图中,从顶点({{ select(15) }})出发存在一条路径可以遍历图中的每条边一次,而且仅遍历一次。
  • A. B点
  • B. A点
  • C. E点
  • D. C点

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

(1)

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

bool judge(int x)
{
    int i=2;
    if(x==0 | | x==1)
        return false;
    while( i <= floor(sqrt(x)) && (x%i != 0) )
        i++;
    if(i > floor(sqrt(x)))
        return true;
    return false;
}

int inverted(int n)
{
    int sum;
    sum = 0;
    while(n > 0)
    {
        sum = sum*10 + n%10;
        n /= 10;
    }
    return sum;
}

int main()
{
    int m,n,k;
    bool flag;
    k = 0;
    flag = false;
    cin >> m >> n;
    for(int i=m; i<=n; i++)
       if( judge(i) && judge(inverted(i)) )
       {
           k++;            
           a[k] = i;
           flag = true;
       }
   if(flag)
    {
       for(int i=1; i<k; i++)
          cout << a[i] << ",";
      cout << a[k] << endl;
    }
   else
      cout<< "No" << endl;
   return 0;
}

判断题

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

  • 正确
  • 错误

17.将第9行中的x%i !=0去掉,程序的运行结果不会改变。 ({{ select(17) }})

  • 正确
  • 错误

18.将第18行删除,程序的运行结果不会改变。 ({{ select(18) }})

  • 正确
  • 错误

19.将第31行删除,程序的运行结果不会改变。 ({{ select(19) }})

  • 正确
  • 错误

选择题

  1. 若输入数据为 1949 2024, 则输出为({{ select(20) }})。
  • 1949,1987
  • 1949,1979
  • 1951,1979
  • 1951,1987

21.若输出为NO,则输入可能为({{ select(21) }})。

  • 168 180
  • 785 792
  • 999 1020
  • 2024 2050

(2)

#include<bits/stdc++. h>
using namespace std;
int main()
{
    string s;
    int len, pos,i,j, sum;
    sum = 0;
    getline(cin,s);
    len = s. size();
    s[len] = ' ';
    for(i=0; i<=len; i++)
    {
        if(s[i] != ' ')
            sum++;
        else
        {
            pos = i;
            for(j=1; j<=sum; j++)
               cout << s[--pos];
            sum = 0;
            if(i != len)
               cout<<" ";
        }
    }
    cout<<endl;
    return 0;
}

判断题

22.将第7行删除,程序的运行结果不会改变。 ({{ select(22) }})

  • 正确
  • 错误

23.将第9行中的s. size()改为s. length(), 程序的运行结果不会改变。 ({{ select(23) }})

  • 正确
  • 错误

24.将第10行s[len] = ' '改为s[len] = 32, 程序的运行结果不会改变。 ({{ select(24) }})

  • 正确
  • 错误

25.将第20行删除,程序的运行结果不会改变。 ({{ select(25) }})

  • 正确
  • 错误

选择题

  1. 若输入 CCF CSP, 则输出为({{ select(26) }})。
  • FCC PSC
  • CCF CSP
  • PS C FCC
  • PSC CCF

27.将第19行中的--pos改为 pos--, 输入 CCF CSP, 则输出为({{ select(27) }})。

  • PS FC
  • CF SP
  • FC PS
  • CC SC

(3)

#include<bits/stdc++. h>
#define N 1000010
using namespace std;
int x, tot, a[N];

void calculate(int n, int step)
{
    int ans;
    ans = 1;
    for(int i=1; i<=step-1; i++)
        ans *= a[i];
    if(ans > x)
        return;
    if(ans == x)
    {
        tot++;
         return;
    }
    for(int i=a[step-1]; i<=x; i++)
        if(n%i == 0)
    {
        n /= i;
        a[step] = i;
        calculate(n, step+1);
        n *= i;
    }
}

int main()
{
    int n;
    cin >> n;
    while(n--)
    {
        tot = 0;
        cin >> x;
        a[0] = 2;
        calculate(x, 1);
        cout << tot << endl;
    }
    return 0;
}

判断题

  1. 若将第2行替换为const int N=1000010; 程序的运行结果不会改变。 ({{ select(28) }})
  • 正确
  • 错误

29.若将第8行删除,程序的运行结果不会改变。 ({{ select(29) }})

  • 正确
  • 错误

30.若将第15行中的 tot++替换为++tot, 程序的运行结果不会改变。 ({{ select(30) }})

  • 正确
  • 错误

31.将第21行和第22行交换,程序的运行结果不会改变。 ({{ select(31) }})

  • 正确
  • 错误

选择题

32.本程序中的算法用到了 ({{ select(32) }})的思想。

  • 贪心
  • 搜索回溯
  • 二分
  • 动态规划

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

  • 7 9
  • 7 8
  • 8 9
  • 8 8

34.(4分) 若输入2 96 2024, 那么输出结果是 ({{ select(34) }})。

  • 18 20
  • 18 21
  • 19 20
  • 19 21

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

(1)给定两个正整数l和r,求区间[1,r]内素数的个数。如下代码是一个经典的计算过程,请将程序补充完整。

输入格式:

第1行有两个整数,分别代表询问次数n和给定区间的右端点最大值m。接下来n行,每行两个整数l和r,代表一次查询。

输出格式:

对于每次查询输出一行,若 l,r∈[1,m],则输出区间内素数的个数,否则输出Crossing the line。

输入样例:

2 5
1 3
1 6

输出样例:

2
Crossing the line
c
#include <bits/stdc++. h>
using namespace std;
const int MAXN = 1e6 + 5;
bool is_prime[MAXN];
int sum[MAXN];
void get_sum(int m)
{
    memset(is_prime, true, sizeof(is_prime));
    is_prime[0] = false;
    is_prime[1] = false;
    for(int i = 2; ①; ++i)
    {
        if(is_prime[i])
        {
            for(②; j <= m; j += i)
                ③ ;
        }
    }
    for(int i = 1; i <= m; ++i)
    {
       if(is_prime[i])
            ④ ;
        else
            sum[i] = sum[i - 1];
    }
}
int main()
{
    int n, m, l, r;
    cin>>n>>m;
    get   sum(m);
    while (n--)
    {
        cin>>l>>r;
        if(l >= 1 && r <= m)
            cout<< ⑤ <<endl;
        else
           cout<<"Crossing the line"<<endl;
    }
    return 0;
}

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

  • i <= m
  • i * i <= m
  • i <= n
  • i * i <= n

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

  • int j = 1
  • int j = 2
  • int j = i
  • int j = i * i

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

  • is prime[j] = true
  • is prime[i] = true
  • is prime[j] = false
  • is prime[i] = false

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

  • sum[i]++
  • sum[i] += sum[i - 1]
  • sum[i] = sum[i - 1]
  • sum[i] = sum[i - 1] + 1

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

  • sum[r+1] - sum[l]
  • sum[r+1] - sum[l-1]
  • sum[r] - sum[l-1]
  • sum[r] - sum[l]

(2) N 位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的 K 位同学排成合唱队形。

合唱队形是指这样的一种队形:设 K 位同学从左到右依次编号为1,2,…,K, 他们的身高分别为 T₁,T₂,…,TK, 则他们的身高满足T₁<T₂<Tₖᵢ<ᵢTK (1<=i<=k)

你的任务是,已知所有 N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。

输入格式:

输入的第1行是一个整数N,表示同学的总数。第2行有N个整数,用空格分隔,第i个整数 Ti是第 i位同学的身高(厘米)。 输出格式:

输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。

数据范围: 2≤N≤100, 130≤T₁≤230。

输入样例:

8

186 186 150 200 160 130 197 220

输出样例:

4

#include <bits/stdc++. h>
using namespace std;
const int MAXN = 2024;
int n, ans=0;
int h[MAXN], f[MAXN], g[MAXN];

int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        scanf("%d", &h[i]);
    for (int i = 1; i <= n; i++)
    {
        ①;
        for (int j = 1; j < i; j++)
           if (② )
               f[i] = max(f[i], f[j] + 1);
    }
    for (int i = n; i; i--)
    {
        g[i] = 1;
        for (int j = n; ③ ; j--)
            if (h[j] < h[i])
                ④;
    }
    for (int i = 1; i <= n; i++)
        ⑤;
    printf(
"%d\n", n - ans);
return 0;
}
  1. ①处应填({{ select(40) }})。
  • f[i] = 1
  • f[i] = 0
  • g[i] = 1
  • g[i] = 0
  1. ②处应填({{ select(41) }})。
  • h[j] <= h[i]
  • h[j] < h[i]
  • h[j] >= h[i]
  • h[j] > h[i]
  1. ③处应填({{ select(42) }})。
  • j >= i
  • j >= 0
  • j > i
  • j > 0
  1. ④处应填({{ select(43) }})。
  • g[i]=max(f[i], f[j]+1)
  • g[i] = max(f[i], g[j]+1)
  • g[i]=max(g[i], f[j]+1)
  • g[i] = max(g[i], g[j]+1)
  1. ⑤处应填({{ select(44) }})。
  • ans=max(ans, f[i]+g[i]-1)
  • ans=max(f[i], g[i]-1)
  • ans=max(ans, f[i]+g[i])
  • ans=max(g[i], f[i]-1)