CSP-S2022初赛

一、单项选择题

假设在基数排序过程中,受宇宙射线的影响,某项数据异变为一个完全不同的值。请问排 序算法结束后,可能出现的最坏情况是()。

A.移除受影响的数据后,最终序列是有序序列

B.移除受影响的数据后,最终序列是前后两个有序的子序列

C.移除受影响的数据后,最终序列是一个有序的子序列和一个基本无序的子序列

D.移除受影响的数据后,最终序列基本无序

解析:

基数排序是按桶排序的思想,某一个值的改变,不会造成其他数字排序失败。排除这个数字,其他数字仍是有序序列。所以选A。

错误解析:

没有学过基数排序,导致对基数排序不太熟悉。


每个顶点度数均为22的无向图称为“22正规图”。由编号为从11到n的顶点构成的所有22正规图,其中包含欧拉回路的不同22正规图的数量为()。

A.n!

B.(n-11)!

C.n!/22

D.(n-11)!/22

解析:

一个图是欧拉图(包含欧拉回路)的条件是充分必要条件是每个顶点的度都是偶数度。

因此根据题目的定义,22正规图每个顶点度数都为22,那么该图一定是欧拉图,其中包含欧拉回路。每个顶点度都为22,设共有n个顶点,总度数为22,每条边提供22个度,因此有n条边。也就是n个顶点n条边连成一个环。顶点11连出的一条边连到的顶点有n-11种选择。

假设连到顶点22,第22步顶点22连到的顶点除了顶点11,有n-22种选择;

假设连到顶点33,第33步顶点33连到的顶点除了顶点1122,有n-33种选择;

第n-11步,顶点n-11只能连到顶点n,有11种选择。

顶点n再连接到顶点11,形成环。共有:

(n1)!(n1)(n2)...1=(n1)!(n1)(n2)...1=(n1)!(n-1)!(n-1)(n-2)...1=(n-1)!(n-1)(n-2)...1=(n−1)!种情况

而这样的环也可以是从顶点11连到顶点n,顶点n连到顶点n-11,顶点n-11连到顶点n-22,……,连到顶点22,顶点22连到顶点11得到。因此相同的环是算了两遍的,因此应该再除以22。所以选D。

错误解析:

不知道欧拉回路是什么意思,没有学过。


小明希望选到形如“省A·LLDDD”的车牌号。车牌号在“·”之前的内容固定的55位号码中,前22位必须是大写英文字母,后33位必须是阿拉伯数字(L代表A至Z,D表示0099,两个L和三个D之间可能相同也可能不同)。请问总共有()个可供选择的车牌号?

A.2028020280

B.5200052000

C.676000676000

D.17576001757600

解析:

  • 确定第11个“L"位置的字母,有2626种情况

  • 确定第22个“L"位置的字母,有2626种情况

  • 确定第11个“D"位置的数字,有1010种情况

  • 确定第22个“D"位置的数字,有1010种情况

  • 确定第33个“D"位置的数字,有1010种情况

根据乘法原理,总情况数为2626101010=67600026*26*10*10*10=676000种情况。所以选C。

错误解析:

计算出了问题,以后认真计算。

二、阅读程序

(1)

1  #include <iostream> 
2  #include <string> 
3  #include <vector> 
4  
5  using namespace std; 
6  
7  int f(const string &s, const string &t) 
8  { 
9      int n = s.length(), m = t.length(); 
10 
11     vector<int> shift(128, m + 1); 
12 
13     int i, j;
14 
15     for (j = 0; j < m; j++)
16         shift[t[j]] = m - j;
17 
18     for (i =0; i<= n - m; i += shift[s[i + m]]){
19         j =0;
20         while(j < m && s[i +j] == t[j]) j++;
21         if (j == m) return i;
22     }
23 
24     return -1;
25 }
26 
27 int main()
28 {
29     string a ,b;
30     cin >> a >> b;
31     cout << f(a, b) << endl;
32     return 0;
33 }

当输入为“baaabaaabaaabaaaa aaaa”,第2020行的“j++”语句执行次数为 ()。

A.99

B.1010

C.1111

D.1212

解析:

手动运行,在纸上执行程序。 shift['a']为1。 i为00,baaa中的第一个b与aaaa中的第11个a不同,直接跳过。此时s[i+m]是b,shift['b']为m+11,i直接增加m+11,也就是55。 i为55,指向第22组baaa中的第11个a。匹配33个a,j++执行33次,遇到b与a不相等。此时s[i+m]是a,shift['a']11,i增加11。 i为66,指向第22组baaa中的第22个a。匹配22个a,j++执行22次,遇到b与a不相等。此时s[i+m]是a,shift['a']11,i增加11。 i为7,指向第22组baaa中的第33个a。匹配11个a,j++执行11次,遇到b与a不相等。此时s[i+m]是a,shift['a']11,i增加11。 i为88,指向第33组baaa中的第1414个b。此时s[i+m]是b,shift['b']为m+11,i直接增加m+11,变为1313

i为1313,执行字符串最后aaaa中的第11个a,与模式串aaaa匹配4个a,j++执行44次。

j++总计执行1010次。所以选B。

错误解析:

没有认真去模拟过程,导致计算出错。

谢谢