#ACSP1006. cspj-模拟题6

cspj-模拟题6

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

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

  1. 2024的因子与质因子分别有({{ select(1) }})个。
  • 18和3
  • 16和3
  • 15和3
  • 16和4
  1. 使用邻接矩阵表示N个结点的有向图,所需要的存储空间为({{ select(2) }})。
  • .N×(N+1)
  • N×(N-1)
  • N×(N-1)/2
  1. 在C+++程序中,表达式a%=b与下列哪个表达式是等价的? ({{ select(3) }})。
  • a=%b
  • a/=b
  • a=b%a
  • a=a%b
  1. 线性表若采用链表存储结构,则要求内存中可用存储单元地址({{ select(4) }})。
  • 必须连续
  • 必须不连续
  • 连续或不连续都行
  • 部分连续
  1. 我们输入一个新闻网站的网址便可访问该网站,其中用到的网络协议是({{ select(5) }})。
  • DNS
  • FTP
  • SSH
  • TELNET
  1. 以下哪个不属于STL中栈的操作函数? ({{ select(6) }})。
  • empty
  • front
  • push
  • pop
  1. 平面上任取n个整点(横坐标和纵坐标都是整数),其中一定存在两个点,它们的中点也是整点,那么n至少是({{ select(7) }})。
  • 4
  • 5
  • 6
  • 7
  1. 以下哪个操作属于位运算范畴? ({{ select(8) }})
  • 88
  • ||
  • >>>
  • ^
  1. 关于树这种数据结构,下面的说法中哪个是正确的? ({{ select(9) }})
  • 满二叉树的结点总数一定是奇数
  • 完全二叉树的结点总数一定是奇数
  • 树形结构只有双亲表示法和孩子表示法
  • 二叉树的遍历方法只有前序遍历法和后序遍历法
  1. 以下哪个选项不属于头文件cmath? ({{ select(10) }})
  • find(iterator first, iterator last, int x)
  • abs(int x)
  • ceil(double x)
  • pow(double x, double y)
  1. 在C++语言中, 表达式584|3的值等于({{ select(11) }})。
  • 7
  • 5
  • 4
  • 3
  1. 定义变量 double n,如果下面的代码输入为1000,则输出最接近({{ select(12) }})。
    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        double n;
        cin>>n;
        cout << log10(n)-log2(n)<< endl;
        return 0;
    }
    
  • 0
  • -5
  • -7
  • 7
  1. 在图的广度优先搜索中,要维护一个标识数组表示已经访问过的图的结点,需要({{ select(13) }})数据结构存放结点以实现遍历。
  • 队列
  • 哈希表
  1. 从一个6×6的棋盘(不可旋转)中选取不在同一行也不在同一列的两个方格,共有({{ select(14) }})种方法。
  • 480
  • 450
  • 360
  • 720
  1. 下列关于集合的说法哪个不正确? ({{ select(15) }})
  • 一个元素是否属于一个集合是确定的
  • 集合中的元素两两不同
  • 0属于空集
  • 集合中的元素不存在先后次序

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

(1)

#include <bits/stdc++.h>
using namespace std;
int main()
{
    set<int> s;
    srand(time(0));
    int n=6;
    int l=12;
    int k,i=0,a[n];
    while(s.size()<n)
    {
        k= rand()%10+1;
        s.insert(k);
    }
    set<int>::iterator it;
    for(it=s.begin(); it!=s.end(); it++)
        a[i++] = *it;
    for(int i=0; i<n; i++)
    {
        int x= rand()%n;
        int y= rand()%n;
        if(a[x] > a[y])
            swap(a[x],a[y]);
    }
    for(int i=0; i<n; i++)
        cout<<a[i]<<" ";
    return 0;
}

判断题 16.若去掉第6行,程序的输出结果不受任何影响。 ({{ select(16) }}})

  • 正确
  • 错误

17.若去掉第8行,程序的输出结果中的数字总数不变。 ({{ select(17) }}})

  • 正确
  • 错误 18.程序的输出结果是一个从小到大排列的整数序列。 ({{ select(18) }}})
  • 正确
  • 错误

19.将第10行中的s.size()替换成s.length(),程序的运行结果不会改变。 ({{ select(19) }}})

  • 正确
  • 错误

选择题

  1. 将第13行s.insert(k)替换成for(int i=1;i<=6;i++)s.insert(i), 则输出为({{ select(20) }})。
  • 12 3 4 5 6
  • 6 5 4 3 2 1
  • 1 2 3 6 5 4
  • 1~6随机分布值

21.将第13行s.insert(k)替换成 for(int i=1;i<=7;i++) s.insert(i), 第20行替换为 int x=i+1, 第21行替换为 int y=i, 则输出为({{ select(21) }})。

  • 1 2 3 4 5 6
  • 6 5 4 3 2 1
  • 2 3 4 5 6 7 1
  • 2 3 4 5 6 7

(2)

#include <bits/stdc++.h>
using namespace std;
int month[13]={-1,31,28,31,30,31,30,31,31,30,31,30,31};
int date,ans1,ans2,y,m,d;
bool check1(int date){
    char s[32];
    sprintf(s, "%d", date);
    if(s[0]==s[7] && s[1]==s[6] && s[2]==s[5] && s[3]==s[4])
        return true;
    return false;
}
bool check2(int date){
    char s[32];
    sprintf(s, "%d", date);
    if(s[0]==s[2] && s[0]==s[5] && s[0]==s[7] && s[1]==s[3] && s[1]==s[4] && s[1]==s[6])
        return true;
    return false;
}
int main()
{
    cin>>date;
    y=date/10000;
    m= date/100%100;
    d= date%100;
    for(int i=y; ;i++){
        if(i%400==0 || (i%100!=0 && i%4==0))
            month[2] = 29;
        else
            month[2] = 28;
        int j=(i==y)?m:1;
        for( ;j<=12;j++){
            int k=(i==y && j==m)?d+1:1;
            for(;k<= month[j];k++){
                int date=i*10000+j*100+k;
                if(check1(date) && ans1==0)
                    ans1= date;
                if(check2(date))
                    return cout<<ans1<<" "<< date<< endl,0;
            }
        }
    }
    return 0;
}

判断题

22.将第3行中的-1改为0,程序的运行不受任何影响。 ({{ select(22) }})

  • 正确
  • 错误

23.去掉第15行中的&& s[1]==s[4] && s[1]==s[6], 程序的输出不变。 ({{ select(23) }})

  • 正确
  • 错误

24.将第23行m= date/100%100替换为 m= date%10000/100, 程序的输出不变。({{ select(24) }})

  • 正确
  • 错误

25.将第30行改为 int j; if(i==y && j==1 || i!=y && j==0) j=m, 程序的输出不变。 ({{ select(25) }})

  • 正确
  • 错误

选择题

  1. 若输入20240204, 则输出为({{ select(26) }})。
  • 20240204 20300302
  • 20300302 20400402
  • 20400402 21211212
  • 20300302 21211212
  1. 若输出20011002 20200202, 则输入可能为({{ select(27) }})。
  • 20011002
  • 20001001
  • 20020101
  • 20020202

(3)

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 100;
bool PrimeNumberJudge(const int & num){
    if (num <= 3)
        return num > 1;
    for (int i = 2; i < num; i++)
        if (num % i == 0)
            return false;
    return true;
}
int& GetNumberSize(const int & num){
    int digit = 0, val = num;
    while(val){
        val /= 10;
        digit++;
    }
    return digit;
}
vector<int>& GetDigits(const int & num, vector<int> & digits){
    int factor = 0;
    for(int num_size= GetNumberSize(num); num_size>0; num_size--){
       factor = num %(int) pow(10.0, num_size);
      factor = factor/(int) pow(10.0, num_size-1);
      digits.push_back(factor);
    }
    return digits;
}
vector<int>& GetKAdjacent(const int &num, vector<int>& adjacent){
    vector<int> digits_number;
    char tmp[128], buf_tmp[128];
    GetDigits(num , digits_number);
    int digits = GetNumberSize(num);
    for(int i = 0; i < digits; i++){
        for (int j = 0; j < digits-i; j++){
           string buf;
           int k = 0;
           while (k <= i){
               sprintf(tmp, "%d", digits_number.at(j+k));
               buf += tmp;
               k++;
           }
           for(int i=0;i<= buf_tmp.size();i++)
              buf_tmp[i] = buf[i];
           adjacent.push_back(atoi(buf_tmp));
       }
   }
    return adjacent;
}
int main(){
    int count=0;
    for (int i = 1; i < MAXN; i++){
        if (PrimeNumberJudge(i)){
            vector<int> buf;
            GetKAdjacent(i, buf);
            int sign = 1;
            for (int j = 0; j < buf.size(); j++){
                if (! PrimeNumberJudge(buf.at(j))){
                    sign = 0;
                    break;
                }
            }
            if(sign)
                count++;
        }
    }
    cout<< count;
    return 0;
}

判断题

  1. 若将第5行 if (num <= 3)替换为 if (num < 3), 程序的运行结果不会改变。({{ select(28) }})
  • 正确
  • 错误

29.若将第7行中的i < num替换为i*i <= num,程序的运行结果不会改变。 ({{ select(29) }})

  • 正确
  • 错误

30.本程序用到的 vector属于STL。 ({{ select(30) }})

  • 正确
  • 错误

31.若将MAXN=100替换为MAXN=70, 程序的运行结果不会改变。 ({{ select(31) }})

  • 正确
  • 错误

选择题

32.运行本程序,输出结果为({{ select(32) }})。

  • 7
  • 8
  • 9
  • 10

33.若将MAXN = 100改为MAXN = 2024, 程序的输出结果为({{ select(33) }})。

  • 9
  • 10
  • 11
  • 12

34.(4分)若将MAXN = 100改为MAXN = 2024, 程序的输出结果为({{ select(34) }})。

  • 11
  • 10
  • 9
  • 大于11的整数

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

(1) 在图像编码的算法中,需要对一个给定的方形矩阵进行Z字形扫描。给定一个 n×n 的矩阵,输出对这个矩阵进行Z字形扫描的结果。

输入格式:

输入的第1行包含一个整数n,表示矩阵的大小。输入的第2行到第 n+1行每行包含 n个正整数,由空格分隔,表示给定的矩阵。

输出格式:

输出一行,包含 n×n个整数,由空格分隔,表示输入的矩阵经过Z字形扫描后的结果。

输入样例:

4
1539
3756
9464
7313

输出样例:

1539739547366413

1≤n≤500, 矩阵元素为不超过1000 的正整数。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n, t, x, y;
    t = 1, x = 1, y = 1;
    int v[505][505], p[505][505];
    cin >> n;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            cin >> p[i][j];
    printf("%d", ①);
    ②;
    while(③)
    {
        if(y + 1 <= n)
        {
            ++t;
            y++;
            v[x][y] = 1;
            printf("%d", p[x][y]);
        }
        while(x + 1 <= n && y - 1 >= 1 && ④)
        {
            ++t;
            v[x + 1][y - 1] = 1;
            printf("%d ", p[x + 1][y - 1]);
            x++;
            y--;
        }
        if(x + 1 <= n)
        {
            ++t;
            x++;
            v[x][y] = 1;
            printf("%d", p[x][y]);
        }
        while(x - 1 >= 1 && y + 1 <= n && !v[x - 1][y + 1])
        {
            ++t;
            ⑤;
            printf("%d", p[x - 1][y + 1]);
            x--;
            y++;
        }
    }
    return 0;
}

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

  • p[0][0]
  • p[0][1]
  • p[1][0]
  • p[1][1]

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

  • v[0][0] = 1
  • v[1][1] = 1
  • v[0][1] = 1
  • v[1][0] = 1

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

  • t < n*n
  • t <= n*n
  • t < n
  • t <= n

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

  • v[x+1][y-1]
  • v[x-1][y+1]
  • !v[x+1][y-1]
  • !v[x-1][y+1]

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

  • exit
  • return 0
  • continue
  • break

(2) 你有一架天平和N个砝码,这N个砝码的重量依次是 请计算:一共可以称出多少种不同的重量?注意砝码可以放在天平两边。

输入格式:

输入的第1行包含一个整数N,表示砝码的总数。第2行包含N个整数:

输出格式:

输出一个整数代表答案。

输入样例:

3

1 4 6

输出样例:

10

样例说明:

能称出的10种重量是1、2、3、4、5、6、7、9、10、11。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 105, maxv = 1e5 + 5;
int n, a[maxn], f[maxn][maxv], sum, ans;
int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        cin >> a[i];
        ①;
    }
    f[0][0] = 1;
    for(int i = 1; i <= n; i++)
    {
        for(int ②; j >= 0; j--)//2
        {
            f[i][j] |= f[i-1][j];
            f[i][j] |= ③;
            if(④)
                f[i][j] |= f[i - 1][j + a[i]];
        }
    }
    for(int i = 1; i <= sum; i++)
       ⑤;
    cout << ans;
    return 0;
}

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

  • sum += a[i]
  • sum += a[1]
  • sum += a[n]
  • sum = a[i]

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

  • j = f[i][j]
  • j = sum-1
  • j = n
  • j = sum

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

  • f[i-1][j-a[i]]
  • f[i-1][abs(j-a[i])]
  • f[i][abs(j-a[i])]
  • f[i-1][a[i]-j]

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

  • j >= i
  • j >= 0
  • j > i
  • j > 0

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

  • 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)