image

编辑人: 未来可期

calendar2025-06-15

message4

visits785

2023年12月CCF-GESP编程能力等级认证C++编程八级真题答案及解析

一、单选题

1、小杨要从A城到B城,又想顺路游览一番。他有两个选项:1、坐高铁路到C城游览,再坐高铁或飞机到B城;2、坐船到D城游览,再坐船、高铁或飞机到B城。请问小杨从A城到B城共有几种交通方案可以选择?(   )。

A、

2

B、

3

C、

5

D、

6

解析:【喵呜刷题小喵解析】:小杨从A城到B城可以选择的交通方案有3种。

对于选项1,小杨可以先坐高铁到C城游览,然后再选择坐高铁或飞机到B城,因此有2种交通方案。

对于选项2,小杨可以先坐船到D城游览,然后再选择坐船、高铁或飞机到B城,因此也有3种交通方案。

综合两个选项,小杨从A城到B城共有3种交通方案可以选择。因此,正确答案是B。

2、以下哪个函数声明是符合语法的,且在调用时可以将二维数组的名字作为实际参数传递给形式参数 a ?(   )。

A、

void QuickSort(int a[][10], int n);

B、

void QuickSort(int a[5][], int m);

C、

void QuickSort(int a[][], int n, int m);

D、

void QuickSort(int ** a, int n, int m);

解析:【喵呜刷题小喵解析】在C语言中,二维数组可以看作是一个指向一维数组的指针。因此,二维数组的名字实际上是一个指向第一行的指针。在函数参数传递时,可以传递一个指向一维数组的指针,即二维数组的名字。

选项A中的函数声明`void QuickSort(int a[][10], int n);`是符合语法的,其中`a[][10]`表示一个指向含有10个整数的数组的指针,即指向二维数组的一行。`n`参数表示二维数组的行数。在调用该函数时,可以将二维数组的名字作为实际参数传递给形式参数`a`。

选项B中的函数声明`void QuickSort(int a[5][], int m);`语法错误,因为C语言中不支持不完整类型的数组作为函数参数。

选项C中的函数声明`void QuickSort(int a[][], int n, int m);`语法错误,因为C语言中不允许对数组的大小进行不明确的声明。

选项D中的函数声明`void QuickSort(int ** a, int n, int m);`虽然语法正确,但它接受的是一个指向指针的指针,而不是指向数组的指针,因此不能作为二维数组的名字进行传递。

因此,选项A是唯一符合语法要求的,并且在调用时可以将二维数组的名字作为实际参数传递给形式参数`a`的函数声明。

3、下面有关C++类和对象的说法,错误的是(   )。

A、

对象的生命周期开始时,会执行构造函数。

B、

对象的生命周期结束时,会执行析构函数。

C、

类的析构函数可以为虚函数。

D、

类的构造函数可以为虚函数。

解析:【喵呜刷题小喵解析】:在C++中,构造函数是用于初始化对象的特殊函数,它会在创建对象时自动调用。析构函数则是用于清理对象资源的特殊函数,它会在对象生命周期结束时自动调用。构造函数和析构函数都不是虚函数,虚函数是在类的继承中使用的,用于实现多态性。因此,选项D“类的构造函数可以为虚函数”是错误的。选项A“对象的生命周期开始时,会执行构造函数”和选项B“对象的生命周期结束时,会执行析构函数”都是正确的。选项C“类的析构函数可以为虚函数”也是正确的,因为在类的继承中,可以通过将析构函数声明为虚函数来实现多态性,确保在删除基类指针时,能够正确地调用派生类的析构函数。

4、使用邻接矩阵表达 n 个顶点的有向图,则该矩阵的大小为(   )。

A、

n×(n+1)

B、

n×n

C、

n×(n-1)

D、

n×(n-1)/2

解析:【喵呜刷题小喵解析】:对于有向图,其邻接矩阵的大小为 n×n,其中 n 为顶点的数量。这是因为对于每个顶点,都会有一行和一列,行表示该顶点的出边,列表示该顶点的入边。因此,邻接矩阵的大小为 n×n。所以正确选项是 n×n,即选项 B。

5、5 位同学排队,其中一位同学不能排在第一,则共有多少种可能的排队方式?(   )。

A、

5

B、

24

C、

96

D、

120

解析:【喵呜刷题小喵解析】:5位同学排队,其中一位同学不能排在第一,那么这位同学只能排在第二、三、四、五的位置,其他4位同学可以排在剩下的4个位置,因此共有4×4=16种排列方式。但是,由于5位同学之间还有排列顺序,所以总的排列方式为16×5=80种。但是,由于有1位同学不能排在第一,所以需要从80种情况中排除掉第一位同学排在第一的情况,即80-5=75种。所以,最终有75×2=150种情况,但其中包含了第一位同学排在第二、三、四、五位置时和其他4位同学互换位置的情况,即重复计算了3×4=12种,所以实际为150-12=138种。但实际上,由于第一位同学不能排在第一,所以只需要考虑其他4位同学的排列,即4的阶乘,也就是4!=24种。因此,共有24种可能的排队方式。

6、一个无向图包含 n 个顶点,则其最小生成树包含多少条边?(   )。

A、

n-1

B、

n

C、

n+1

D、

最小生成树可能不存在。

解析:【喵呜刷题小喵解析】:在一个无向图中,如果包含n个顶点,那么其最小生成树(Minimum Spanning Tree,MST)的边数一定是n-1。这是因为最小生成树是一个连通图,它连接了所有的顶点,但没有形成任何回路。在一个无向连通图中,如果边数少于n-1,则图不是连通的;如果边数多于n-1,则图中会存在回路。因此,最小生成树的边数一定是n-1。所以,正确答案是A。

7、已知三个 double 类型的变量 a 、 b 和 theta 分别表示一个三角形的两条边长及二者的夹角(弧度),则下列哪个表达式可以计算这个三角形的面积?(   )。

A、

a * b * sin(theta) / 2

B、

(a + b) * sin(theta) / 2

C、

a * b * cos(theta) / 2

D、

sqrt(a * a + b * b - 2 * a * b * cos(theta))

解析:【喵呜刷题小喵解析】:根据三角形面积的计算公式,面积S = 1/2 * a * b * sin(theta),其中a和b是三角形的两条边长,theta是它们之间的夹角(以弧度为单位)。选项D中的表达式是海伦公式,用于计算三角形面积,其形式为S = sqrt[p * (p - a) * (p - b) * (p - c)],其中p是半周长,即(a + b + c) / 2。但在本题中,没有给出c,因此无法直接使用海伦公式。而选项A中的表达式与三角形面积的计算公式不符,选项B和C中的表达式也不正确。因此,正确答案是D。

8、对有 n 个元素的二叉排序树进行中序遍历,其时间复杂度是(   )。

A、

O(1)

B、

O(log(n))

C、

O(n)

D、

O(n2)

解析:【喵呜刷题小喵解析】:二叉排序树(Binary Sort Tree)也被称为二叉搜索树(Binary Search Tree)。对于二叉搜索树,其最大的特性就是任何节点的左子树上所有节点的值都小于该节点,任何节点的右子树上所有节点的值都大于该节点。

对于二叉搜索树进行中序遍历,结果会得到一个有序的数列。这是因为中序遍历的顺序是先遍历左子树,然后访问根节点,最后遍历右子树。这种遍历方式使得遍历结果是一个升序序列。

在最坏的情况下,二叉搜索树会退化成链表,此时中序遍历的时间复杂度为O(n),其中n为树中元素的个数。因此,选项C“O(n)”是正确的答案。

9、假设输入参数 m 和 n 满足m≤n,则下面程序的最差情况的时间复杂度为(   )。

A、

O(log(n))

B、

O(n)

C、

O(n×m)

D、

O(m×log(n))

解析:【喵呜刷题小喵解析】

首先,我们分析给定的程序。该程序是一个嵌套循环,外层循环和内层循环分别遍历数组。外层循环从0到n-1,内层循环从0到m-1。

在每次外层循环迭代中,内层循环都会执行m次。因此,整个嵌套循环将执行n * m次。

根据大O表示法,我们只需要关注最高阶项。在这个例子中,最高阶项是n * m,所以时间复杂度是O(n * m)。

现在,我们来看选项:

A. O(log(n)) - 这个选项与我们的分析不符,因为我们没有使用对数操作。

B. O(n) - 这个选项也不符合,因为我们还有一个m的因子。

C. O(n * m) - 这个选项与我们的分析相符。

D. O(m * log(n)) - 这个选项也不符合,因为我们没有使用对数操作,并且我们的复杂度与m的顺序无关。

因此,根据分析,程序的最差情况的时间复杂度是O(n * m),所以正确答案是C。

10、下面程序的时间复杂度为(   )。

A、

O(n)

B、

O(an)

C、

O(log(n))

D、

O(log(n)×a)

解析:【喵呜刷题小喵解析】:该算法的时间复杂度主要取决于循环的次数。由于循环变量i从1到n,所以循环的次数为n。因此,该算法的时间复杂度为O(n)。

11、下面程序的时间复杂度为(   )。

A、

O(2n)

B、

O(2m×(n-m))

C、

O(C(n,m))

D、

O(m×(n-m))

解析:【喵呜刷题小喵解析】:从提供的程序中可以看出,有一个for循环嵌套一个for循环。外层循环遍历1到n,内层循环遍历m+1到n。因此,总的循环次数为m×(n-m)。所以,该程序的时间复杂度为O(m×(n-m))。因此,选项D是正确答案。

12、下面的程序使用出边的邻接表表达有向图,则下列选项中哪个是它表达的图?(   )。

A

B

C

D

解析:【喵呜刷题小喵解析】:根据题目中的出边邻接表,可以分析出图的结构。邻接表以节点为索引,列出所有指向该节点的边。根据邻接表,可以得知节点A指向节点B和节点C,节点B指向节点C,节点C没有指向其他节点。因此,这个图应该是一个有向图,其中A指向B和C,B指向C,没有其他的边。选项D中的图符合这个描述,所以正确答案是D。

13、下面程序的输出为(   )。

A、

12

B、

18

C、

36

D、

42

解析:【喵呜刷题小喵解析】:本题考察的是程序运行和输出。首先,观察图片中的程序,它计算的是一个阶乘函数。阶乘函数是一个递归函数,其定义如下:n! = n * (n-1)!。当n为0时,0! = 1。

根据这个定义,我们可以计算出:

* 3! = 3 * 2 * 1 = 6
* 4! = 4 * 3 * 2 * 1 = 24
* 5! = 5 * 4 * 3 * 2 * 1 = 120
* 6! = 6 * 5 * 4 * 3 * 2 * 1 = 720

然后,观察主函数中的循环,它计算的是从3到6的阶乘之积。根据上面的计算,我们可以得到:

3! * 4! * 5! * 6! = 6 * 24 * 120 * 720 = 120960

最后,主函数中的输出语句输出的是阶乘之积除以12的余数,即:

120960 % 12 = 0

但是,由于输出语句中使用了printf函数,并且格式字符串为"%d",因此输出的是整数。在这种情况下,0会被舍去,输出1。

然后,主函数中的另一个输出语句输出的是阶乘之积除以18的余数,即:

120960 % 18 = 12

因此,程序的输出为12,选项B正确。

14、下面程序的输出为(   )。

A、

3

B、

6

C、

11

D、

22

解析:【喵呜刷题小喵解析】:该程序使用了for循环来计算一个数学表达式。首先,定义了一个变量`sum`并初始化为0,然后通过一个for循环从1到10(包括10)对`sum`进行累加。每次循环中,`sum`的值都会增加`i`(循环变量)。因此,最终`sum`的值是1+2+3+...+10,这是一个等差数列的前10项和,其和是55。然后,程序输出`sum`除以2的结果,即55/2=27.5,但由于输出格式是整数,所以输出结果为27。但题目中给出的选项并没有27,可能是题目或选项出错了。再次检查题目和选项,发现应该是输出27的一半,即13.5,但输出格式是整数,所以输出为14。进一步观察选项,发现14的一半是7,但7也不是选项中的值。再次检查,发现应该是输出14除以2的结果,即7,但输出格式是整数,所以输出结果为7。最后,检查选项,发现选项C中的11正好是7的两倍,因此正确答案应该是选项C,即11。但这里存在一个问题,原始答案应该是7,而不是11,所以选项设置可能也有误。如果按照正确的逻辑,原始答案应该是7,但选项中并没有7,所以无法确定正确答案。需要更多信息来确认正确答案。

15、下面的程序中,二维数组 h 和 v 分别代表如下图所示的网格中的水平边的时间消耗和垂直边的时间消耗。

程序使用动态规划计算从左下角到右上角的最小时间消耗,则横线处应该填写下列哪个选项的代码?(   )。

A、

dis[i][j] = min(dis[i - 1][j] + v[i - 1][j], dis[i][j - 1] + h[i][j - 1]);

B、

dis[i][j] = min(dis[i - 1][j] + h[i - 1][j], dis[i][j - 1] + v[i][j - 1]);

C、

dis[i + 1][j + 1] = min(dis[i][j + 1] + v[i][j + 1], dis[i + 1][j] + h[i + 1][j]);

D、

dis[i + 1][j + 1] = min(dis[i][j + 1] + h[i][j + 1], dis[i + 1][j] + v[i + 1][j]);

解析:【喵呜刷题小喵解析】:根据题目描述,我们需要计算从左下角到右上角的最小时间消耗。动态规划是一种常用的解决此类问题的算法。在这个问题中,我们可以定义一个二维数组dis[i][j],其中dis[i][j]表示从左下角到网格中位置(i, j)的最小时间消耗。

对于每个位置(i, j),我们可以从它的上方和左方到达,因此它的最小时间消耗应该是上方和左方的最小时间消耗加上从上方或左方到位置(i, j)的时间消耗。具体地,对于位置(i, j),我们可以从位置(i - 1, j)上方到达,其时间消耗为v[i - 1][j];或者从位置(i, j - 1)左方到达,其时间消耗为h[i][j - 1]。因此,我们可以得到状态转移方程:dis[i][j] = min(dis[i - 1][j] + v[i - 1][j], dis[i][j - 1] + h[i][j - 1])。

因此,选项A的代码是正确的。选项B的状态转移方程中的数组索引不正确,选项C和D的状态转移方程中的数组索引和时间消耗数组使用不正确。

二、判断题

16、C++语言非常强大,可以用来求解方程的解。例如,如果变量 x 为 double 类型的变量,则执行语句 x * 2- 4 = 0; 后,变量 x 的值会变为 2.0 。

A 正确

B 错误

解析:【喵呜刷题小喵解析】:题目中的表达式 `x * 2 - 4 = 0` 是一个方程,不是赋值语句,无法直接执行来改变变量 `x` 的值。如果要将方程的解赋值给 `x`,应该使用赋值语句,如 `x = (2 * 4) / 2;`。因此,题目中的描述是错误的。

17、一个袋子中有3个完全相同的红色小球、2个完全相同的蓝色小球。每次从中取出1个,且不放回袋子,这样进行3次后,将取出的小球依次排列,则可能的颜色顺序有7种。

A 正确

B 错误

解析:【喵呜刷题小喵解析】:根据题意,袋中有3个红色小球和2个蓝色小球。第一次取球,有5种可能(3红2蓝);第二次取球,有4种可能(2红2蓝);第三次取球,有3种可能(1红2蓝或2红1蓝)。因此,三次取球后可能的颜色顺序为:红红红、红红蓝、红蓝红、红蓝蓝、蓝红红、蓝红蓝、蓝蓝红,共7种。所以,题目的说法是正确的。

18、杨辉三角,是二项式系数的一种三角形排列,在中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现,是中国数学史上的一项伟大成就。

A 正确

B 错误

解析:【喵呜刷题小喵解析】:杨辉三角确实是二项式系数的一种三角形排列,这是数学界公认的事实。同时,题目中提到在中国南宋数学家杨辉所著的《详解九章算法》一书中出现,也符合历史记载。因此,题目的陈述是正确的。

19、N个顶点的有向完全图(不带自环)有N×(N-1)/2条边。

A 正确

B 错误

解析:【喵呜刷题小喵解析】:有向完全图是指任意两个顶点之间都有一条有向边,但自环是指一个顶点指向自己的边,题目中明确提到“不带自环”,因此每个顶点只能与其他N-1个顶点相连。对于每一个顶点,它都可以与N-1个其他顶点相连,因此总的边数为N×(N-1)。但是,这样每条边都被计算了两次(例如,顶点A到顶点B的边和顶点B到顶点A的边是同一条边),所以需要除以2,得到N×(N-1)/2条边。因此,该判断是正确的。

20、如果待查找的元素确定,只要哈希表的大小不小于查找元素的个数,就一定存在不会产生冲突的哈希函数。

A 正确

B 错误

解析:【喵呜刷题小喵解析】:虽然哈希表的大小不小于查找元素的个数可以减少冲突的可能性,但不能保证一定不存在冲突。哈希函数的选择对于冲突的产生有着重要影响。如果哈希函数设计不合理,即使哈希表的大小足够大,也可能出现冲突。因此,说“一定存在不会产生冲突的哈希函数”是不准确的。

21、动态规划算法的时间复杂度一般为:必要状态的数量,乘以计算一次状态转移方程的时间复杂度。

A 正确

B 错误

解析:【喵呜刷题小喵解析】:动态规划算法的时间复杂度通常取决于必要状态的数量和计算一次状态转移方程的时间复杂度。这是因为动态规划算法需要遍历所有必要状态,并对每个状态计算其转移方程。因此,动态规划算法的时间复杂度一般为必要状态的数量乘以计算一次状态转移方程的时间复杂度。所以,题目中的描述是正确的。

22、已知 int 类型的变量 a 、 b 和 h 中分别存储着一个梯形的顶边长、底边长和高,则这个梯形的面积可以通过表达式 (a + b) * h / 2 求得。

A 正确

B 错误

解析:【喵呜刷题小喵解析】:梯形的面积计算公式为 (a + b) * h / 2,其中a和b是梯形的上下底边长,h是高。题目中给出变量a、b和h分别存储着梯形的顶边长、底边长和高,但描述有误,应该是a和b分别存储梯形的上下底边长。因此,原题目中的描述虽然变量命名有误,但其表达的意思——梯形的面积可以通过表达式 (a + b) * h / 2 求得——是正确的。故答案为A。

23、判断图是否连通只能用广度优先搜索算法实现。

A 正确

B 错误

解析:【喵呜刷题小喵解析】:判断图是否连通的方法并不仅限于广度优先搜索算法,还可以使用深度优先搜索算法、并查集等多种方法实现。广度优先搜索算法是一种用于遍历或搜索树或图的算法,其通过逐层遍历图中的所有节点来判断连通性。虽然广度优先搜索是一种有效的方法,但并非唯一的方法。因此,题目中的说法是错误的。

24、在 个元素的二叉排序树中查找一个元素,最好情况的时间复杂度是O(logN)。

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在二叉排序树(也叫二叉搜索树)中查找一个元素,最好情况的时间复杂度是O(logN)。这是因为二叉排序树具有自平衡的特点,树的高度通常接近其最小可能值,即O(logN)。在最理想的情况下,元素恰好位于树的中间,此时查找时间复杂度为O(logN)。因此,选项A正确。

25、给定 double 类型的变量 x ,且其值大于等于 ,我们可以通过二分法求出的近似值。

A 正确

B 错误

解析:【喵呜刷题小喵解析】:题目中提到了使用二分法来求解一个特定函数的近似值。二分法是一种在有序数据集合中查找特定元素的算法,其基本原理是不断将数据集分成两半,然后判断目标值在哪一半,从而逐步逼近目标值。对于连续函数,如果函数在某一区间内单调,那么就可以使用二分法来求解函数的近似值。因此,题目中的描述是正确的。

三、实操题

26、奖品分配

时间限制:1.0 s

内存限制:128.0 MB

问题描述

班上有N名同学,学号从0到N-1。有 种奖品要分给这些同学,其中,第M种奖品总共有ai个(i=0,1,…,M-1)。巧合的是,奖品的数量不多不少,每位同学都可以恰好分到一个奖品,且最后剩余的奖品不超过1个(即:N≤a0+a1+…+aM-1≤N+1)。

现在,请你求出每个班级礼物分配的方案数,所谓方案,指的是为每位同学都分配一个种类的奖品。只要有一位同学获得了不同种类的奖品,即视为不同的方案。方便起见,你只需要输出方案数对109+7取模后的结果即可。

共有T个班级都面临着奖品分配的问题,你需要依次为他们解答。

输入描述

第一行一个整数T,表示班级数量。

接下来 行,每行若干用单个空格隔开的正整数。首先是两个正整数N,M,接着是M个正整数a0,a1,…,aM-1

保证N≤a0+a1+…+aM-1≤N+1。

输出描述

输出T行,每行一个整数,表示该班级分配奖品的方案数对109+7取模的结果。

特别提醒

在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。


样例输入 1

3
3 2 1 2
3 2 1 3
5 3 3 1 1

样例输出 1

3
4
20

样例解释 1

对于第 1 个班级,学号为0,1,2的同学可以依次分别获得奖品0,1,1,也可以依次分别获得奖品1,0,1,也可以依次分别获得奖品1,1,0,因此共有3种方案。

对于第 2 个班级,学号为0,1,2的同学可以依次分别获得奖品0,1,1,也可以依次分别获得奖品1,0,1,也可以依次分别获得奖品1,1,0,也可以依次分别获得奖品1,1,1,因此共有4种方案。

对于第 3 个班级,可以把编号为1的奖品分配给5名同学中的任意一名,共有5种方案;再把编号为2的奖品分配给剩余4名同学中的任意一名,共有4种方案;最后给剩余3名同学自然获得0号奖品。因此,方案数为5×4=20。


样例输入 2

5
100 1 100
100 1 101
20 2 12 8
123 4 80 20 21 3
999 5 101 234 499 66 99

样例输出 2

1
1
125970
895031741
307187590

数据规模

对于30%的测试点,保证N≤10。

对于另外30%的测试点,保证M=2。

对于所有测试点,保证N≤1000;保证T≤1000;保证M≤1000。

参考答案:【输入样例】33 2 1 23 2 1 35 3 3 1 1【输出样例】3420【解析】对于第一个班级,有3名同学和2种奖品,每种奖品各有1个。因为奖品的数量不多不少,每位同学都可以恰好分到一个奖品,且最后剩余的奖品不超过1个,所以可以为每位同学都分配一个种类的奖品。例如,学号为0,1,2的同学可以依次分别获得奖品0,1,1,也可以依次分别获得奖品1,0,1,也可以依次分别获得奖品1,1,0,因此共有3种方案。对于第二个班级,同样有3名同学和2种奖品,奖品0有1个,奖品1有2个。可以为学号为0的同学分配奖品0,为学号为1的同学分配奖品1,为学号为2的同学分配奖品1,也可以为学号为0的同学分配奖品1,为学号为1的同学分配奖品0,为学号为2的同学分配奖品1,还可以为学号为0的同学分配奖品1,为学号为1的同学分配奖品1,为学号为2的同学分配奖品0,还可以为学号为0,1,2的同学都分配奖品1,因此共有4种方案。对于第三个班级,有5名同学和3种奖品,奖品0有3个,奖品1有1个。可以为编号为1的奖品分配给5名同学中的任意一名,共有5种方案;再把编号为2的奖品分配给剩余4名同学中的任意一名,共有4种方案;最后给剩余3名同学自然获得0号奖品。因此,方案数为5×4=20。【喵呜AI答案】中的数字与【输入样例】中的数字对应,依次输出了每个班级的奖品分配方案数。

解析:【喵呜刷题小喵解析】
本题是一道组合计数问题,需要求出每个班级礼物分配的方案数。由于奖品的数量不多不少,每位同学都可以恰好分到一个奖品,且最后剩余的奖品不超过1个,因此可以为每位同学都分配一个种类的奖品。

对于每个班级,我们可以按照奖品的种类进行分配。首先,将同一种奖品分配给不同的同学,方案数为该奖品的数量。然后,将剩余的奖品分配给其他同学,方案数为剩余奖品数量的阶乘。最后,将不同种类的奖品进行排列组合,方案数为所有奖品数量的阶乘的乘积。

具体地,对于第i个班级,有N名同学和M种奖品,每种奖品各有a_i个。我们可以按照以下步骤计算方案数:

1. 对于第i种奖品,可以将其分配给N名同学中的任意一名,共有a_i种方案。
2. 对于剩余的N-a_i名同学,可以将其余的奖品进行分配,方案数为(N-a_i)!。
3. 将M种奖品进行排列组合,方案数为M!。

因此,总方案数为a_0! * a_1! * ... * a_M-1! * (N-a_0-a_1-...-a_M-1)!。

但是,由于方案数可能非常大,需要对10^9+7取模。可以使用快速幂和阶乘取模的技巧来计算方案数。

对于每个班级,我们只需要计算一次方案数即可。因此,总时间复杂度为O(T * (M * log(max(a_i)) + N * log(N))),其中T为班级数量,M为奖品种类数,N为同学数量,max(a_i)为奖品数量最大值。

27、大量的工作沟通

时间限制:2.0 s

内存限制:128.0 MB

问题描述

某公司有N名员工,编号从0至N-1。其中,除了0号员工是老板,其余每名员工都有一个直接领导。我们假设编号为i的员工的直接领导是fi。

该公司有严格的管理制度,每位员工只能受到本人或直接领导或间接领导的管理。具体来说,规定员工x可以管理员工y,当且仅当x=y,或f=fy,或x可以管理fy。特别地,0号员工老板只能自我管理,无法由其他任何员工管理。

现在,有一些同事要开展合作,他们希望找到一位同事来主持这场合作,这位同事必须能够管理参与合作的所有同事。如果有多名满足这一条件的员工,他们希望找到编号最大的员工。你能帮帮他们吗?

输入描述

第一行一个整数N,表示员工的数量。

第二行N-1个用空格隔开的正整数,依次为f1,f2…,fN-1

第三行一个整数Q,表示共有Q场合作需要安排。

接下来Q行,每行描述一场合作:开头是一个整数m(2≤m≤N),表示参与本次合作的员工数量;接着是m个整数,依次表示参与本次合作的员工编号(保证编号合法且不重复)。

保证公司结构合法,即不存在任意一名员工,其本人是自己的直接或间接领导。

输出描述

输出Q行,每行一个整数,依次为每场合作的主持人选。

特别提醒

在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。


样例输入 1

5
0 0 2 2
3
2 3 4
3 2 3 4
2 1 4

样例输出 1

2
2
0

样例解释 1

对于第一场合作,员工3,4有共同领导2,可以主持合作。

对于第二场合作,员工2本人即可以管理所有参与者。

对于第三场合作,只有0号老板才能管理所有员工。


样例输入 2

7
0 1 0 2 1 2
5
2 4 6
2 4 5
3 4 5 6
4 2 4 5 6
2 3 4

样例输出 2

2
1
1
1
0

数据规模

对于25%的测试点,保证N≤50。

对于50%的测试点,保证N≤300。

对于所有测试点,保证3≤N≤105;保证Q≤100,保证m≤104

参考答案:由于输入没有给出,因此无法提供具体的答案。但可以根据题目的要求,给出大致的解题步骤和思路。首先,根据题目描述,可以构建一个N个节点的有向图,其中节点代表员工,有向边代表管理关系。然后,对于每场合作,找到能够管理所有参与者的节点,如果有多个这样的节点,选择编号最大的节点。具体的算法可以如下:1. 构建有向图:遍历每个员工,根据题目给出的领导关系,构建有向图。2. 对于每场合作,遍历参与合作的员工,找到能够管理所有参与者的节点。具体地,对于每个参与合作的员工,找到其所有领导,然后找到这些领导的领导,以此类推,直到找到一个节点能够管理所有参与者。3. 如果有多个节点能够管理所有参与者,选择编号最大的节点。由于题目中保证公司结构合法,因此可以通过上述算法找到能够管理所有参与者的节点。

解析:【喵呜刷题小喵解析】:

该题是一道关于有向图和图遍历的题目,可以通过构建有向图并使用深度优先搜索(DFS)或广度优先搜索(BFS)算法来解决。

首先,需要构建一个有向图,其中节点代表员工,有向边代表领导关系。可以使用一个邻接表来表示这个有向图。对于每个员工,记录其领导的编号,然后遍历每个员工,构建邻接表。

然后,对于每场合作,需要找到能够管理所有参与者的节点。可以通过深度优先搜索或广度优先搜索来遍历有向图,找到能够管理所有参与者的节点。具体地,可以从每个参与者开始,向上遍历其领导,直到找到一个节点能够管理所有参与者。

在遍历过程中,可以记录能够管理所有参与者的节点,并比较编号大小。如果有多个节点能够管理所有参与者,选择编号最大的节点。

需要注意的是,由于题目中保证公司结构合法,因此不会出现任意一名员工,其本人是自己的直接或间接领导的情况。因此,可以通过上述算法找到能够管理所有参与者的节点。

另外,由于题目中限制了时间和内存,因此需要使用高效的算法来解决问题。可以通过使用邻接表来表示有向图,并使用DFS或BFS算法来遍历有向图,以提高算法的效率。同时,可以通过使用哈希表来记录能够管理所有参与者的节点,以便快速找到编号最大的节点。

喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:2023年12月CCF-GESP编程能力等级认证C++编程八级真题答案及解析

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share