#4767. 2020年CSP-J 初赛试题

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

  1. 在内存储器中每个存储单元都被赋予一个唯一的序号,称为()。
  1. 编译器的主要功能是( )。
  1. 设 x=true,y=true,z=false,以下逻辑运算表达式值为真的是( )。
  1. 现有一张分辨率为 2048×1024 像素的 32 位真彩色图像。请问要存储这张图像,需要多大的存储空间?( )。
  1. 冒泡排序算法的伪代码如下: nn 个数用以上冒泡排序算法进行排序,最少需要比较多少次?( )。

6.设 AAnn 个实数的数组,考虑下面的递归算法: 请问算法 XYZ 的输出是什么?()。

  1. 链表不具有的特点是()。
  1. 1010 个顶点的无向图至少应该有( )条边才能确保是一个连通图。
  1. 二进制数 10111011 转换成十进制数是( )。
  1. 55 个小朋友并排站成一列,其中有两个小朋友是双胞胎,如果要求这两个双胞胎必须相邻,则有( )种不同排列方法?
  1. 下图中所使用的数据结构是( )。
  1. 独根树的高度为 11。具有 6161 个结点的完全二叉树的高度为( )。
  1. 干支纪年法是中国传统的纪年方法,由 1010 个天干和 1212 个地支组合成 6060 个天干地支。由公历年份可以根据以下公式和表格换算出对应的天干地支。 天干 =(公历年份)除以 1010 所得余数 地支 =(公历年份)除以 1212 所得余数 例如,今年是 20202020 年,20202020 除以 1010 余数为 00,查表为"庚”;20202020 除以 1212,余数为 44,查表为“子” 所以今年是庚子年。

请问 19491949 年的天干地支是( )

  1. 1010 个三好学生名额分配到 77 个班级,每个班级至少有一个名额,一共有( )种不同的分配方案。
  1. 有五副不同颜色的手套(共 1010 只手套,每副手套左右手各 11 只),一次性从中取 66 只手套,请问恰好能配成两副手套的不同取法有( )种。

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

  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;
}

•判断题

1) 输入的字符串应当只由大写字母组成,否则在访问数组时可能越界。( )

2)若输入的字符串不是空串,则输入的字符串与输出的字符串一定不一样。( )

3)将第 12 行的 i < 26 改为 i < 16,程序运行结果不会改变。( )

4)将第 26 行的 i < 26 改为 i < 16,程序运行结果不会改变。( )

•单选题

5) 若输出的字符串为 ABCABCABCA,则下列说法正确的是( )

6)若输出的字符串为 CSPCSPCSPCSP,则下列说法正确的是( )

  1. 本题共13.5分
#include <iostream>
using namespace std;

long long n, ans;
int k, len;
long long d[1000000];

int main() {
  cin >> n >> k;
  d[0] = 0;
  len= 1;
  ans = 0;
  for (long long i = 0; i <n; ++i) {
    ++d[0];
    for (int j = 0; j + 1<len; ++j) {
      if (d[j] == k) {
        d[j] = 0;
        d[j + 1] += 1;
        ++ans;
      }
    }
    if (d[len- 1] == k) {
      d[len - 1] = 0;
      d[len] =1;
      ++len;
      ++ans;
    }
  }
  cout << ans << endl;
  return 0;
}

假设输入的 nn 是不超过 2622^{62}的正整数,kk 都是不超过 1000010000 的正整数,完成下面的判断题和单选题:

·判断题

1)若 k=1k=1,则输出 ansans 时,len=nlen=n。( )

2)若 k>1k>1,则输出 ansans 时,lenlen —定小于 nn。( )

3)若 k>1k>1,则输出 ansans 时,klenk^{len} —定大于 nn。( )

·单选题

4) 若输入的 nn 等于:101510^{15},输入的 kk11,则输出等于( )。

5)若输入的 nn 等于 205,891,132,094,649205,891,132,094,649(即 3303^{30}),输入的 kk33,则输出等于( )。

6) 若输入的 nn 等于 100,010,002,000,090100,010,002,000,090,输入的 kk1010,则输出等于( )。

  1. 本题共14.5分
#include <algorithm>
#include <iostream>
using namespace std;                     
                                        
int n;                                   
int d[50][2];                            
int ans;                                 
                                       
void dfs(int n, int sum) {               
 if (n == 1) {                            
   ans = max(sum, ans);           
   return;                                   
 }                                        
 for (int i = 1; i < n; ++i) {            
   int a = d[i - 1][0], b = d[i - 1][1];  
   int x = d[i][0], y = d[i][1];            
   d[i - 1][0] = a + x;                     
   d[i - 1][1] = b + y;                     
   for (int j = i; j < n - 1; ++j)            
     d[j][0] = d[j + 1][0], d[j][1] = d[j + 1][1];
   int s = a + x + abs(b - y);              
   dfs(n - 1, sum + s);                    
   for (int j = n - 1; j > i; --j)          
     d[j][0] = d[j - 1][0], d[j][1] = d[j - 1][1];
   d[i - 1][0] = a, d[i - 1][1] = b;        
   d[i][0] = x, d[i][1] = y;                
 }                                        
}                                        
                                      
int main() {                             
 cin >> n;                                
 for (int i = 0; i < n; ++i)              
 cin >> d[i][0];
 for (int i = 0; i < n;++i)
    cin >> d[i][1];
 ans = 0;
 dfs(n, 0);
 cout << ans << endl;
 return 0;
}

假设输入的 nn 是不超过 5050 的正整数,d[i][0]、d[i][i] 都是不超过 1000010000 的正整数,完成下面的判断题和单选题:

· 判断题

1)若输入 nn00,此程序可能会死循环或发生运行错误。( )

2)若输入 nn2020,接下来的输入全为 00,则输出为 00。( )

3)输出的数一定不小于输入的 d[i][0] 和 d[i][1] 的任意一个。( )

·单选题

4)若输入的 nn2020,接下来的输入是 202099202000,则输出为( )。

5)若输入的 nn3030,接下来的输入是 3030003355,则输出为( )。

6)若输入的 nn1515,接下来的输入是 151511,以及 151511,则输出为( )。(本题4 分)

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

(质因数分解)给出正整数 nn,请输出将 nn 质因数分解的结果,结果从小到大输出。

例如:输入 n=120n=120,程序应该输出 2 2 2 3 5,表示:120=2×2×2×3×5120 = 2 \times 2 \times 2 \times 3 \times 5。输入保证 2n1092\le n \le 10^9

提示:先从小到大枚举变量 ii,然后用 ii 不停试除 nn 来寻找所有的质因子。

试补全程序。

#include <cstdio>
using namespace std;
int n, i;

int main() {
  scanf("%d", &n);
  for(i =;<=n; i ++){{
      printf("%d ", i);
      n = n / i;
    }
  }
  if()
    printf("%d ",);
  return 0;
}

1)①处应填( )

2)②处应填( )

3)③处应填( )

4)④处应填( )

5)⑤处应填( )

(最小区间覆盖)给出 nn 个区间,第 ii 个区间的左右端点是 [ai,bi][a_i,b_i]。现在要在这些区间中选出若干个,使得区间 [0,m][0,m] 被所选区间的并覆盖(即每一个 0im0\leq i\leq m 都在某个所选的区间中)。保证答案存在,求所选区间个数的最小值。

输入第一行包含两个整数 nnmm1n5000,1m1091\le n \le 5000,1\le m \le 10^9

接下来 nn 行,每行两个整数 ai,bia_i,b_i0ai,bim0\le a_i,b_i \le m)。

提示:使用贪心法解决这个问题。先用 O(n2)O(n^2) 的时间复杂度排序,然后贪心选择这些区间。

试补全程序。

#include <iostream>

   using namespace std;

   const int MAXN = 5000;
   int n, m;
   struct segment { int a, b; } A[MAXN];

   void sort() // 排序
   {
     for (int i = 0; i < n; i++)
     for (int j = 1; j < n; j++)
     if ()
         {
           segment t = A[j];}
   }

   int main()
   {
     cin >> n >> m;
     for (int i = 0; i < n; i++)
       cin >> A[i].a >> A[i]・b;
     sort();
     int p = 1;
     for (int i = 1; i < n; i++)
       if ()
         A[p++] = A[i];
     n = p;
     int ans =0, r = 0;
     int q = 0;
     while (r < m)
     {
       while ()
         q++;;
       ans++;
     }
     cout << ans << endl;
     return 0;
   }

1)①处应填( )

2)②处应填( )

3)③处应填( )

4)④处应填( )

5)⑤处应填( )

参考答案(请提交完答案后再看)