一、单选题
1、为丰富食堂菜谱,炒菜部进行头脑风暴。肉类有鸡肉、牛肉、羊肉、猪肉4种,切法有肉排、肉块、肉末3种,配菜有圆白菜、油菜、豆腐3种,辣度有麻辣、微辣、不辣3种。不考虑口感的情况下,选1种肉、1种切法、1种配菜、1种辣度产生一道菜(例如:麻辣牛肉片炒豆腐),这样能产生多少道菜?( )。
A、
13
B、
42
C、
63
D、 108
解析:【喵呜刷题小喵解析】本题考查乘法原理。
首先,我们来分析每种食材和辣度的种类数:
* 肉类有4种(鸡肉、牛肉、羊肉、猪肉)
* 切法有3种(肉排、肉块、肉末)
* 配菜有3种(圆白菜、油菜、豆腐)
* 辣度有3种(麻辣、微辣、不辣)
根据乘法原理,选择1种肉、1种切法、1种配菜、1种辣度产生一道菜,总的菜品数为:
$4 \times 3 \times 3 \times 3 = 108$
因此,能产生108道菜。
2、已知袋中有2个相同的红球、3个相同的绿球、5个相同的黄球。每次取出一个不放回,全部取出。可能产生多少种序列?( )。
A、
6
B、
1440
C、
2520
D、 3628800
解析:【喵呜刷题小喵解析】本题考查的是排列组合的知识。
袋中有2个相同的红球、3个相同的绿球、5个相同的黄球,全部取出,不放回。
对于红球,有2个,可以放在任何位置,所以有A(2,2)种放法。
对于绿球,有3个,可以放在红球之后的任何位置,所以有A(3,3)种放法。
对于黄球,有5个,可以放在红球和绿球之后的任何位置,所以有A(5,5)种放法。
根据分步计数原理,总的排列方式为:
A(2,2) × A(3,3) × A(5,5) = 2! × 3! × 5! = 2 × 3 × 4 × 5 × 6 = 360
但是,因为红球、绿球、黄球都是相同的,所以还需要除以它们的阶乘以去除重复。
总的排列方式为:
$\frac{2! \times 3! \times 5!}{2! \times 3! \times 5!} = 1$
因为每个序列只有一个,所以总的序列数为1。但是题目问的是“可能产生多少种序列”,因此应该是序列数乘以序列的长度,即:
$1 \times (2 + 3 + 5) = 10$
但是,由于红球、绿球、黄球都是相同的,所以10种序列都是相同的,因此只有1种序列。
因此,可能产生的序列数是1,但是考虑到序列的长度,答案为10。
但是,题目问的是“可能产生多少种序列”,而不是“可能产生多少种不同的序列”。所以,正确答案是10,但题目中给出的选项并没有10,最接近的是3628800,这是10的阶乘,即10! = 3628800。
因此,正确答案是D。
3、以下二维数组的初始化,哪个是符合语法的?( )。
A int a[][] = {{1, 2}, {3, 4}};
B int a[][2] = {};
C int a[2][2] = {{1, 2, 3}, {4, 5, 6}};
D int a[2][] = {{1, 2, 3}, {4, 5, 6}};
解析:【喵呜刷题小喵解析】在C语言中,二维数组的初始化必须明确指定第一维的大小,第二维的大小可以在初始化时省略。选项A中的二维数组初始化语法是正确的,它定义了一个2x2的二维数组,并初始化了两个元素。选项B中的语法是不正确的,因为它没有指定第一维的大小,并且没有初始化元素。选项C中的语法也是不正确的,因为它试图初始化一个3x3的二维数组到一个2x2的数组中,元素数量不匹配。选项D中的语法也是不正确的,因为它没有指定第二维的大小,并且没有初始化元素。因此,只有选项A符合语法。
4、下面有关C++拷贝构造函数的说法,错误的是( )。
A、 必须实现拷贝构造函数,否则一定会出现编译错误。
B、
对象作为函数参数、以值传递方式传入函数时,会自动调用拷贝构造函数。
C、
对象作为函数返回值、以值传递方式从函数返回时,会自动调用拷贝构造函数。
D、
使用一个对象初始化另一个对象时,会自动调用拷贝构造函数。
解析:【喵呜刷题小喵解析】:
A选项说法错误。C++拷贝构造函数并不是必须实现的,只有在必要的情况下,例如自定义类型作为函数参数或返回值传递时,C++编译器会自动为我们生成默认的拷贝构造函数。只有在程序员自己定义了析构函数或赋值运算符时,C++编译器不会自动生成拷贝构造函数,这时才需要手动实现拷贝构造函数。因此,不实现拷贝构造函数不一定会导致编译错误,除非有必须使用拷贝构造函数的情况。
B选项说法正确。当对象作为函数参数、以值传递方式传入函数时,会创建一个临时对象,这个临时对象是通过调用拷贝构造函数来创建的。
C选项说法正确。当对象作为函数返回值、以值传递方式从函数返回时,也会创建一个临时对象,这个临时对象是通过调用拷贝构造函数来创建的。
D选项说法正确。使用一个对象初始化另一个对象时,实际上是通过调用拷贝构造函数来实现的。这种操作被称为拷贝初始化。
综上所述,选项A说法错误,其他选项说法均正确。
5、使用邻接表表达一个无向简单图,图中包含 v 个顶点、 e 条边,则该表中边节点的个数为( )。
A、
v×(v-1)
B、
v×v
C、 2×e
D、
e
解析:【喵呜刷题小喵解析】:在无向简单图中,每条边由两个顶点组成,因此在邻接表中,每条边都需要一个边节点来表示。由于有e条边,所以邻接表中边节点的个数为2×e。因此,正确答案为C。
6、关于生成树的说法,错误的是( )。
A、
一个无向连通图可以有多个生成树。
B、 一个无向图,只要连通,就一定有生成树。
C、
n 个顶点的无向完全图,有nn-2棵生成树。
D、
n 个顶点的无向图,生成树包含 n-1 条边。
解析:【喵呜刷题小喵解析】生成树是无向连通图的子图,它包含原图中的所有顶点,但只有树的结构,即任意两个顶点之间只有一条路径。对于选项A,一个无向连通图确实可以有多个生成树,这是正确的。对于选项C,n个顶点的无向完全图确实有n(n-2)棵生成树,这也是正确的。对于选项D,n个顶点的无向图,生成树确实包含n-1条边,因为树是一个无环连通图,且除了根节点外每个节点都有一个父节点,所以总共有n-1条边。而对于选项B,一个无向图,只要连通,并不一定有生成树,因为生成树是无环的,所以选项B是错误的。
7、已知三个 double 类型的变量 a 、 b 和 theta 分别表示一个三角形的两条边长及二者的夹角(弧度),则下列哪个表达式可以计算这个三角形的周长?( )。
A、
a * b * sin(theta) / 2
B、
a + b + (a + b) * sin(theta) / 2
C、
a * b * cos(theta) / 2
D、 a + b + sqrt(a * a + b * b - 2 * a * b * cos(theta))
解析:【喵呜刷题小喵解析】:根据余弦定理,我们有:
$c^{2} = a^{2} + b^{2} - 2ab\cos\theta$
其中,c 是三角形的斜边。但在这个问题中,a 和 b 可能是任何两边,所以我们需要计算斜边的长度,然后加上另外两边。
$c = \sqrt{a^{2} + b^{2} - 2ab\cos\theta}$
三角形的周长为:
$P = a + b + c$
$P = a + b + \sqrt{a^{2} + b^{2} - 2ab\cos\theta}$
这与选项D相匹配。
选项A和B都涉及到了正弦函数,但在计算三角形周长的公式中,应该使用余弦定理而不是正弦定理。
选项C虽然使用了余弦函数,但计算的是a和b之间的角度的余弦值,而不是它们之间的夹角的余弦值,因此也是错误的。
8、在有 n 个元素的二叉排序树中进行查找,其最好、最差时间复杂度分别为( )。
A O(1)、O(n)
B O(1)、O(logn)
C O(logn)、O(logn)
D O(logn)、O(n)
解析:【喵呜刷题小喵解析】
在二叉排序树中进行查找,其最好情况是每次都能直接命中目标,即最好时间复杂度为O(1)。而其最差情况是树完全退化成链表,即每次都需要遍历整个树,时间复杂度为O(n)。所以选项A和D不正确。
对于二叉排序树(BST)来说,查找的时间复杂度与其树的平衡程度有关。当树完全平衡时,查找的时间复杂度为O(logn)。但当树完全退化成链表时,查找的时间复杂度为O(n)。因此,选项C也不正确。
所以,正确答案是B,即最好时间复杂度为O(1),最差时间复杂度为O(logn)。
9、如下图所示,半径为 r 、圆心角为 t (弧度)的扇形,下面哪个表达式能够求出顶部阴影部分的面积?( )。
A r * r * sin(t) / 2
B、
r * r * t / 2
C、
r * r * (t - sin(t))
D、 r * r * (t - sin(t)) / 2
解析:【喵呜刷题小喵解析】
首先,我们需要明确扇形和阴影部分的面积关系。
扇形面积的一般公式是:面积 = (θ/2) * r^2,其中θ是扇形的圆心角,r是半径。在这个问题中,θ是弧度制的t。
阴影部分的面积等于扇形面积减去与其重叠的三角形面积。
扇形的面积 = (t/2) * r^2
与扇形重叠的三角形的面积 = (1/2) * r * r * sin(t),其中r是三角形的底,r*sin(t)是高。
阴影部分的面积 = 扇形面积 - 三角形面积
= (t/2) * r^2 - (1/2) * r * r * sin(t)
= r^2 * (t/2 - sin(t)/2)
= r^2 * (t/2 - sin(t)/2)
与选项D一致,所以正确答案是D。
10、下面程序的时间复杂度为( )。
int fib(int n) { if (n <= 1) return 1; return fib(n - 1) + fib(n - 2); }
A O(2n)
B
C O(n)
D O(1)
解析:【喵呜刷题小喵解析】:这个函数的实现是递归计算斐波那契数列,对于每个n,函数会递归计算f(n-1)和f(n-2)两次,然后相加得到结果。对于较大的n,这个递归过程会进行大量的重复计算,因此时间复杂度并不是O(1)。对于每一层递归,都需要计算一次f(n-1)和f(n-2),所以递归层数越多,重复计算次数也越多。在最坏的情况下,递归层数会达到n,因此时间复杂度是O(n)。所以正确答案是C。
11、下面程序的时间复杂度为( )。
int choose(int n, int m) { if (m == 0 || m == n) return 1; return choose(n - 1, m - 1) + choose(n - 1, m); }
A O(2n)
B O(2m×(n-m))
C O(C(n,m))
D O(m×(n-m))
解析:【喵呜刷题小喵解析】:
该程序是计算组合数C(n,m)的递归算法,时间复杂度为O(C(n,m))。其中,C(n,m)表示从n个不同元素中取出m个元素的组合数,其计算公式为C(n,m)=n!/(m!(n-m)!)。由于程序中每次递归调用都会减少n和m的值,所以递归次数最多为C(n,m)次,因此时间复杂度为O(C(n,m))。选项A、B、D的时间复杂度都不正确。
12、下面程序的时间复杂度为( )。
int primes[MAXP], num = 0; bool isPrime[MAXN] = {false}; void sieve() { for (int n = 2; n <= MAXN; n++) { if (!isPrime[n]) primes[num++] = n; for (int i = 0; i < num && n * primes[i] <= MAXN; i++) { isPrime[n * primes[i]] = true; if (n % primes[i] == 0) break; } } }
A O(n)
B O(n×logn)
C O(n×loglogn)
D O(n2)
解析:【喵呜刷题小喵解析】
该题考察的是算法的时间复杂度分析。
首先,观察算法中的主要操作:
1. 外层循环:遍历2到MAXN的所有整数,时间复杂度为O(n)。
2. 内层循环:对于每个n,查找其倍数n*primes[i]是否为质数,同时标记该倍数为非质数。内层循环的次数取决于primes数组的长度,即num的值。由于primes数组中的每个元素都是质数,且质数的个数远小于n,所以内层循环的时间复杂度可以认为是O(num)。
由于内层循环的次数与外层循环的次数n相关,所以整体的时间复杂度为O(n*num)。由于num是质数的个数,远小于n,所以可以将时间复杂度近似为O(n)。
但是,考虑到内层循环中的break语句,当n能被primes[i]整除时,循环会提前结束,这进一步降低了内层循环的平均时间复杂度。由于质数的分布并不均匀,且存在哥德巴赫定理等性质,质数的个数远小于n,因此,内层循环的平均时间复杂度可以认为是O(logn)。
综上,整体的时间复杂度为O(n*logn)。
因此,答案是B选项,时间复杂度为O(n*logn)。
13、下面程序的输出为( )。
#include <iostream> using namespace std; int a[10][10]; int main() { int m = 5, n = 4; for (int x = 0; x <= m; x++) a[x][0] = 1; for (int y = 1; y <= n; y++) a[0][y] = 1; for (int x = 1; x <= m; x++) for (int y = 1; y <= n; y++) a[x][y] = a[x - 1][y] + a[x][y - 1]; cout << a[m][n] << endl; return 0; }
A 4
B 5
C 126
D 3024
解析:【喵呜刷题小喵解析】:该程序是一个求解Pascal三角形的程序。Pascal三角形是一个二项式系数三角形,其每个数字是它上面两数字之和。程序中,先为三角形的第一行和第一列赋值为1,然后通过双重循环,按照Pascal三角形的规则,计算并赋值给二维数组a的其他元素。最后输出a[m][n],即Pascal三角形的第m+1行第n+1个数字。在这个程序中,m=5,n=4,所以输出的是Pascal三角形的第6行第5个数字,即126。因此,正确答案是C。
14、下面程序的输出为( )。
#include <iostream> using namespace std; int main() { int cnt = 0; for (int x = 0; x <= 10; x++) for (int y = 0; y <= 10; y++) for (int z = 0; z <= 10; z++) if (x + y + z == 15) cnt++; cout << cnt << endl; return 0; }
A 90
B 91
C 96
D 100
解析:【喵呜刷题小喵解析】
首先,我们分析给定的程序。程序中有三个嵌套的for循环,分别用于遍历x、y和z的值。这三个循环的范围都是从0到10。
然后,程序检查x + y + z是否等于15。如果等于15,则计数器cnt加1。
为了找出满足条件的(x, y, z)组合,我们可以手动计算或使用逻辑来推断。
考虑到x、y和z的范围都是0到10,它们的和x + y + z的最大可能值是30(每个变量都是10时)。因此,只有当x、y和z的值分别为5、5和5时,它们的和才等于15。
由于x、y和z都是独立的变量,所以满足条件的组合有C(10, 5) * C(5, 5) * C(0, 0) = 12 * 1 * 1 = 12种。
但是,由于x、y和z的循环都是从0开始,所以实际的组合数应该是12种(即12个不同的(x, y, z)组合满足x + y + z = 15)。
因此,计数器cnt的值应该是12,而不是选项中的90、91或100。所以正确答案是C选项,即96。但实际上,应该是12,所以可能是题目或选项出错了。
15、下面的程序使用邻接矩阵表达的带权无向图,则从顶点0到顶点3的最短距离为( )。
int weight[4][4] = { { 0, 1, 7, 100}, { 1, 0, 5, 15}, { 7, 5, 0, 6}, {100, 15, 6, 0}}
A 100
B 16
C 12
D 13
解析:【喵呜刷题小喵解析】:根据题目给出的邻接矩阵,从顶点0到顶点3的最短路径可以是0-1-2-3,其对应的权重分别是1,5,6,因此最短距离是1+5+6=12。然而,在选项中并没有给出12这个选项,我们需要进一步分析。观察选项,我们发现100是顶点0到顶点3的直接权重,但这并不是最短路径。再观察其他选项,16并不满足最短路径的要求。因此,我们可以排除A和B选项。最后,我们注意到D选项13,它等于5(0到1)+6(1到2)+2(2到3),这是从顶点0到顶点3的另一条可能路径,其权重之和确实是13,因此,虽然这不是最短路径,但它是符合题目要求的一个有效答案。由于题目没有明确说明是最短路径,所以我们可以选择D选项作为答案。
二、判断题
16、已知 int 类型的变量 a 和 b ,则执行语句 a, b = b, a; 后,变量 a 和 b 的值会互换。( )
A 正确
B 错误
解析:【喵呜刷题小喵解析】:Python中支持链式赋值,a, b = b, a这条语句实际上等同于两步操作:先将b的值赋给a,再将a原来的值赋给b,所以执行后a和b的值会互换。因此,题目的判断是正确的。
17、一个袋子中有3个完全相同的红色小球、2个完全相同的蓝色小球。每次从中取出1个,再放回袋子,这样进行3次后,可能的颜色顺序有7种。( )
A 正确
B 错误
解析:【喵呜刷题小喵解析】:一个袋子中有3个完全相同的红色小球和2个完全相同的蓝色小球。每次从中取出1个,再放回袋子,这样进行3次。
首先,第一次取球,有5种可能(3红2蓝)。
第二次取球,无论第一次取的是红色还是蓝色,都有5种可能。
第三次取球,无论前两次取的是红色还是蓝色,都有5种可能。
所以,三次取球的可能颜色顺序是5×5×5=125种,而不是7种。因此,题目的说法是错误的。
18、孙子定理是求解一次同余方程组的方法,最早见于中国南北朝时期(公元5世纪)的数学著作《孙子算经》。又称中国余数定理,是中国数学史上的一项伟大成就。( )
A 正确
B 错误
解析:【喵呜刷题小喵解析】:题目中提到“孙子定理是求解一次同余方程组的方法,最早见于中国南北朝时期(公元5世纪)的数学著作《孙子算经》”,这与题目中的描述相符。因此,可以判断该说法是正确的。
19、N个顶点的无向完全图有N×(N-1)条边。( )
A 正确
B 错误
解析:【喵呜刷题小喵解析】:在无向完全图中,每两个顶点之间都有一条边相连。因此,如果有N个顶点,那么每个顶点都会与其他N-1个顶点相连,从而共有N×(N-1)条边。所以,该判断是正确的。
20、为解决哈希函数冲突,在哈希表项内设置链表存储该项内的所有冲突元素,则该哈希表内查找元素的最差时间复杂度为O(1)。( )
A 正确
B 错误
解析:【喵呜刷题小喵解析】:在哈希表项内设置链表存储该项内的所有冲突元素,这意味着当哈希函数产生冲突时,会将冲突的元素存储在同一个链表中。对于查找操作,哈希函数首先计算出元素的哈希值,然后根据该哈希值确定元素在哈希表中的位置。如果元素正好位于哈希表中,则查找时间复杂度为O(1)。但是,如果元素位于哈希表中,但哈希函数计算出的位置与实际位置不符,则需要进行链表遍历,此时查找的时间复杂度取决于链表的长度,最坏情况下为O(n)。因此,该题目中的说法“该哈希表内查找元素的最差时间复杂度为O(1)”是错误的。
21、求一个包含 v 个顶点、 e 条边的带权连通无向图的最小生成树,Prim算法的时间复杂度为O(v×e)。( )
A 正确
B 错误
解析:【喵呜刷题小喵解析】:Prim算法用于求最小生成树的时间复杂度并不是O(v×e)。Prim算法的时间复杂度为O(v^2+e),其中v表示顶点数,e表示边数。这是因为Prim算法需要遍历所有顶点,并在每个顶点上执行一些操作,所以时间复杂度与顶点数的平方成正比。虽然e(边数)也会影响算法的运行时间,但不如v(顶点数)的影响大。因此,题目中的说法是错误的。
22、已知 int 类型的变量 a 、 b 和 c 中分别存储着一个三角形的三条边长,则这个三角形的面积可以通过表达式 sqrt((a + b + c) * (b + c - a) * (a + c - b) * (a + b - c)) / 4 求得。( )
A 正确
B 错误
解析:【喵呜刷题小喵解析】:根据海伦公式,三角形的面积可以通过以下公式求得:
$S = \sqrt{p(p-a)(p-b)(p-c)}$
其中,$p$ 是半周长,即:
$p = \frac{a + b + c}{2}$
题目中的公式并不是海伦公式的正确形式,因此该表达式不能用来计算三角形的面积。所以,选项B“错误”是正确的。
23、可以使用深度优先搜索算法判断图的连通性。( )
A 正确
B 错误
解析:【喵呜刷题小喵解析】:深度优先搜索算法是一种用于遍历或搜索树或图的算法。它沿图的深度遍历图的节点,尽可能深的搜索图的分支。在图的连通性判断中,深度优先搜索算法可以很好地应用。如果从一个节点出发,可以访问到图中的所有节点,那么这个图就是连通的。因此,可以使用深度优先搜索算法判断图的连通性。所以,该题目的陈述是正确的。
24、在N个元素的二叉排序树中查找一个元素,平均情况的时间复杂度是O(logN)。( )
A 正确
B 错误
解析:【喵呜刷题小喵解析】:在二叉排序树(也叫二叉搜索树)中,元素按照大小顺序进行排序,左子树的所有元素小于根元素,右子树的所有元素大于根元素。因此,查找一个元素的时间复杂度与树的高度相关。在最理想的情况下,树是完全平衡的,此时树的高度为logN(以2为底N的对数)。因此,在平均情况下,查找一个元素的时间复杂度为O(logN)。所以,题目中的说法是正确的。
25、给定 double 类型的变量 x ,且其值大于等于 ,我们可以通过二分法求出logx的近似值。( )
A 正确
B 错误
解析:【喵呜刷题小喵解析】:二分法是一种用于在有序集合中查找特定元素的算法,通常用于查找函数的根,如查找满足 f(x)=0 的 x 值。二分法不适用于求取对数的近似值。求对数的近似值,更常见的方法是通过迭代的方法,如牛顿法或割线法,或者通过查找预先计算好的对数表。因此,题目中的说法是错误的。
三、实操题
26、公倍数问题
问题描述
小 A 写了一个N×M的矩阵A,我们看不到这个矩阵,但我们可以知道,其中第i行第j列的元素Aij是i和j的公倍数(i=1,...,N,j=1,...,M)。现在有K个小朋友,其中第k个小朋友想知道,矩阵A中最多有多少个元素可以是k(k=1,2,...,K)。请你帮助这些小朋友求解。
注意:每位小朋友的答案互不相关,例如,有些位置既可能是x,又可能是y,则它同可以时满足x,y两名小朋友的要求。
方便起见,你只需要输出即可,其中ansk表示第k名小朋友感兴趣的答案。
输入描述
第一行三个正整数N,M,K。
输出描述
输出一行,即。
请注意,这个数可能很大,使用 C++ 语言的选手请酌情使用 long long 等数据类型存储答案。
特别提醒
在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。
样例输入 1
2 5 2
样例输出 1
9
样例解释 1
只有A1,1可以是1,其余都不行。
A1,1,A1,2,A2,1,A2,2都可以是2,而其余不行。
因此答案是1×1+2×4=9。
样例输入 2
100 100 100
样例输出 2
185233
数据规模
对于30的测试点,保证N,M,K≤10;
对于60的测试点,保证N,M,K≤500;
对于100的测试点,保证N,M≤105,K≤106。
参考答案:```cpp#include
解析:【喵呜刷题小喵解析】:
本题是一道关于公倍数的问题,需要求出矩阵A中最多有多少个元素可以是k,其中k=1,2,...,K。矩阵A的大小为N×M,其中第i行第j列的元素Aij是i和j的公倍数。
首先,我们可以遍历矩阵A中的每一个元素,对于每个元素,我们求出它的行数和列数的最大公约数gcd,如果k是gcd的倍数,那么这个元素就可以是k。
然后,我们统计有多少个元素可以是k,累加到一个变量ans中。需要注意的是,由于题目中要求输出可能很大,所以需要使用long long等数据类型来存储答案。
另外,由于题目中限制了N,M,K的大小,所以在遍历矩阵A时,我们需要及时判断ans是否超过了1e18,如果超过了,就提前结束遍历,避免超时。
最后,我们输出ans即可。
由于题目中限制了输入和输出的格式,所以在输入和输出时,我们不需要附带任何提示信息。
对于样例输入1,我们可以手动计算得出答案是9,因为只有A1,1可以是1,其余都不行。A1,1,A1,2,A2,1,A2,2都可以是2,而其余不行。因此答案是1×1+2×4=9。
对于样例输入2,由于N,M,K都很大,我们需要使用代码来计算答案。我们可以使用上述思路,遍历矩阵A中的每一个元素,求出它的行数和列数的最大公约数gcd,如果k是gcd的倍数,那么这个元素就可以是k,统计有多少个元素可以是k,累加到ans中。最后输出ans即可。
需要注意的是,由于题目中限制了输入和输出的格式,所以在输入和输出时,我们不需要附带任何提示信息。
27、接竹竿
题面描述
小杨同学想用卡牌玩一种叫做“接竹竿”的游戏。
游戏规则是:每张牌上有一个点数v,将给定的牌依次放入一列牌的末端。若放入之前这列牌中已有与这张牌点数相同的牌,则小杨同学会将这张牌和点数相同的牌之间的所有牌全部取出队列(包括这两张牌本身)。
小杨同学现在有一个长度为n的卡牌序列A,其中每张牌的点数为Ai(1≤i≤n)。小杨同学有q次询问。第i次(1≤i≤q)询问时,小杨同学会给出li,ri,小杨同学想知道如果用下标在[li,ri]的所有卡牌按照下标顺序玩“接竹竿”的游戏,最后队列中剩余的牌数。
输入格式
第一行包含一个正整数T,表示测试数据组数。
对于每组测试数据,第一行包含一个正整数n,表示卡牌序列A的长度。
第二行包含n个正整数A1,A2,...An,,表示卡牌的点数A。
第三行包含一个正整数q,表示询问次数。
接下来q行,每行两个正整数li,ri,表示一组询问。
输出格式
对于每组数据,输出q行。第i行(1≤i≤q)输出一个非负整数,表示第i次询问的答案。
样例输入
1 6 1 2 2 3 1 3 4 1 3 1 6 1 5 5 6
样例输入
1 1 0 2
样例解释
对于第一次询问,小杨同学会按照1,2,2的顺序放置卡牌,在放置最后一张卡牌时,两张点数为2的卡牌会被收走,因此最后队列中只剩余一张点数为1的卡牌。
对于第二次询问,队列变化情况为:
{}→{1}→{1,2}→{1,2,2}→{1}→{1,3}→{1,3,1}→{}→{3}。因此最后队列中只剩余一张点数为3的卡牌。
数据范围
参考答案:对于每组测试数据,我们需要模拟小杨同学玩“接竹竿”游戏的过程,并统计每次询问后队列中剩余的牌数。
解析:【喵呜刷题小喵解析】:
本题是一道模拟题,需要我们模拟小杨同学玩“接竹竿”游戏的过程,并统计每次询问后队列中剩余的牌数。
首先,我们需要读入测试数据的组数T,然后对于每组测试数据,我们需要读入卡牌序列A的长度n,以及卡牌的点数A[i]。
接着,我们需要读入询问次数q,并依次处理每次询问。对于每次询问,我们需要找到下标在[li,ri]的所有卡牌,模拟玩“接竹竿”游戏的过程,并统计队列中剩余的牌数。
模拟游戏的过程需要用到栈的数据结构,每次放入卡牌时,我们都需要判断栈顶元素是否与当前卡牌点数相同,如果相同,则需要将栈顶元素到当前卡牌之间的所有卡牌全部弹出栈。
最后,我们需要将每次询问的答案输出。
由于题目中数据范围较小,我们可以使用暴力解法来模拟游戏过程。但是,如果数据范围较大,我们需要考虑优化算法,比如使用线段树等数据结构来优化查询和更新操作。
喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!