image

编辑人: 桃花下浅酌

calendar2025-06-12

message2

visits846

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

一、单选题

1、下面有关函数参数的说法,正确的是(   )。

A、

函数参数传递时,主函数当中采用值传递方式将参数传递给子函数时,若子函数将参数值改变,主函数当中的参数值不变。

B、

函数参数传递时,主函数当中采用值传递方式将参数传递给子函数时,若子函数将参数值改变,主函数当中的参数值将随子函数一样改变而改变。

C、

函数参数传递时,主函数如果将参数的地址传递给子函数,若子函数将参数值改变,主函数当中的参数值将不改变。

D、

函数参数传递可以不满足子函数的参数个数要求。

解析:【喵呜刷题小喵解析】:函数参数传递时,主函数当中采用值传递方式将参数传递给子函数时,若子函数将参数值改变,主函数当中的参数值不变。这是因为值传递是将参数的值复制到子函数中,而不是传递参数的引用。因此,子函数对参数值的修改不会影响到主函数中的参数值。选项A正确描述了这一行为。选项B错误,因为值传递不会改变主函数中的参数值。选项C描述的是指针传递,即传递参数的地址,而不是值传递,所以C错误。选项D错误,因为函数参数传递必须满足子函数的参数个数要求,否则会导致编译错误。

2、下面C++代码执行后,输出的是(   )。

A、

chen

B、

c

C、

chen a dai

D、

dai

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

首先,我们分析给定的C++代码。

代码中的关键部分是一个字符串字面量,它包含两个字符:'c'和'h'。然后,代码使用`std::cout`将字符串输出到控制台。

但是,在输出之前,代码使用了一个不太常见的技巧:它使用了一个指针来访问字符串字面量的第一个字符,然后使用`std::cout`输出该字符。接着,它再次使用`std::cout`输出字符串字面量的第二个字符。

字符串字面量 `'chen a dai'` 的第一个字符是 'c',第二个字符是 'h'。因此,代码的输出将是 'ch'。

但是,题目中给出的选项并没有 'ch' 这个选项。这可能是题目或选项的一个错误。如果我们假设题目和选项都是正确的,那么我们需要从给出的选项中选择最接近 'ch' 的选项。

在给定的选项中,选项C 'chen a dai' 最接近 'ch',因为它包含了这两个字符。因此,最合理的答案是选项C。

然而,如果我们要基于代码的实际输出,那么输出应该是 'ch',而不是选项中的任何一个。所以,这个题目可能存在一些错误或不一致的地方。

3、下面C++代码最后执行后输出是(   )。

A 1

B 2

C 3

D 4

解析:【喵呜刷题小喵解析】:根据题目中的代码,我们可以逐步分析。

首先,我们注意到代码中有一个循环,循环的条件是i < 3。循环体内的代码会输出i的值,并且i自增1。

当i=0时,输出i的值,得到0。
当i=1时,输出i的值,得到1。
当i=2时,输出i的值,得到2。

由于循环的条件是i < 3,当i=2时,循环结束,不再继续执行。因此,最后输出的结果是0、1和2,共三个数字。

因此,正确答案是C选项,输出结果为3。

4、下面C++代码执行后的结果是(   )。

A

B

C

D

解析:【喵呜刷题小喵解析】:根据题目中的代码,代码首先声明了一个int类型的变量i,并将其初始化为0。然后,代码进入一个for循环,循环条件是i小于10。在循环体中,代码将i的值加1,并输出i的值。由于循环条件i小于10,循环会执行10次,因此输出的结果应该是0到9这10个整数。所以,代码执行后的结果是输出0到9这10个整数,选项C中的图片表示的就是0到9这10个整数,因此正确答案是C。

5、下面C++代码执行后输出是(   )。

A、

1,2,3

B、

1

C、

2

D、

3

解析:【喵呜刷题小喵解析】:在C++中,数组下标从0开始。在提供的代码中,数组a的大小为3,下标分别为0、1、2。因此,循环语句for(int i=0; i<3; i++)会依次执行三次,分别对应下标0、1、2。在循环体中,cout << a[i] << " ";会输出数组a中对应下标的元素,即1、2、3,所以输出结果为1 2 3。

6、如果变量x的地址是0x6ffe14,下面C++代码执行以后输出的是(   )。

A、

0x6ffe11

B、

0x6ffe14

C、

0x6ffe18

D、

0x6ffe15

解析:【喵呜刷题小喵解析】根据题目,变量x的地址是0x6ffe14。在C++中,&操作符返回的是变量的地址。因此,&x返回的就是变量x的地址,即0x6ffe14。所以,输出结果为0x6ffe14,选项B正确。

7、在C++中,执行下面代码后,输出的是(   )。

A、

400

B、

200

C、

20

D、

100

解析:【喵呜刷题小喵解析】:在C++中,数组名代表数组的首地址,即数组第一个元素的地址。因此,在代码`cout << &a[0] - a;`中,`&a[0]`是数组第一个元素的地址,而`a`是数组名,代表数组的首地址,即第一个元素的地址。所以,`&a[0] - a`的值就是数组元素之间的地址差,即数组元素之间的间隔。由于数组`a`有10个元素,每个元素占用4个字节(假设是32位系统),所以`&a[0] - a`的值就是10个元素之间的地址差,即40个字节。但是,在C++中,两个指针相减得到的是它们之间相差的元素个数,而不是字节数。因此,`&a[0] - a`的值就是10,即选项B。

8、下列C++语句执行以后结果是true的是(   )。

A、

3&&false

B、

5&&2

C、

101&&000

D、

4&true

解析:【喵呜刷题小喵解析】在C++中,逻辑与操作符`&&`要求两个操作数都为true时,整个表达式才为true。

A选项:`3&&false`,第一个操作数为true,第二个操作数为false,所以整个表达式为false。

C选项:`101&&000`,两个操作数都是八进制数,转换为十进制后分别为65和0,所以整个表达式为false。

D选项:`4&true`,这里应该是`4&&true`,但`&`是位与操作符,不是逻辑与操作符。如果修正为`4&&true`,第一个操作数为true,第二个操作数为true,但由于使用了`&`而不是`&&`,所以整个表达式的结果是4,不是true。

B选项:`5&&2`,两个操作数都为true,所以整个表达式为true。

9、在如下的C++代码中实现了对字符串中出现的26个字母的个数统计,横线处应填入是(   )。

A、

alpha[i]=alpha[i-1]+1;

B、

alpha[i]=alpha[i]+1;

C、

alpha[i+1]=alpha[i]+1;

D、

alpha[i-1]=alpha[i]+1;

解析:【喵呜刷题小喵解析】:在给出的C++代码中,需要统计字符串中每个字母出现的次数。对于字母的计数,应使用`alpha[i]`表示第`i`个字母的计数,其中`i`是当前正在处理的字母的索引。因此,每次遇到一个字母,需要将`alpha[i]`增加1。

观察选项:

A. `alpha[i]=alpha[i-1]+1;`:这个选项试图将前一个字母的计数加1后赋值给当前字母的计数,这是不正确的。

B. `alpha[i]=alpha[i]+1;`:这个选项只是将当前字母的计数加1,但并未进行任何更新或存储,因此也是不正确的。

C. `alpha[i+1]=alpha[i]+1;`:这个选项试图将当前字母的计数加1后赋值给下一个字母的计数,这是不正确的。

D. `alpha[i-1]=alpha[i]+1;`:这个选项试图将当前字母的计数加1后赋值给前一个字母的计数,这同样是错误的。

正确的选项应该是将当前字母的计数加1,即`alpha[i]=alpha[i]+1;`,但考虑到数组索引从0开始,并且`alpha`数组的长度是26,这意味着索引`i`的范围是0到25。由于选项中没有直接表示`alpha[i]=alpha[i]+1;`的,最接近的选项是C,但应该是`alpha[i] = alpha[i] + 1;`(注意分号)。但由于选项中没有这个确切的形式,我们可以认为C选项是错误的。

因此,正确的做法是直接对`alpha[i]`进行加1操作,即`alpha[i] += 1;`。但在这个特定的选择题中,没有提供这样的选项,最接近的是C选项,尽管它有一个索引错误。

所以,虽然C选项在形式上最接近正确答案,但由于其索引错误,正确答案应该是不提供在选项中的`alpha[i] += 1;`。

在实际编程中,为了避免这类索引错误,通常会使用循环变量来迭代字符串中的每个字符,而不是硬编码索引。例如:


```cpp
for (int i = 0; i < str.length(); i++) {
char c = str[i];
if (isalpha(c)) {
int index = c - 'a'; // 将字符转换为索引
alpha[index]++;
}
}
```
这样,无论字符串的长度如何,都可以正确处理每个字母的计数。

10、下面C++代码执行后生成的文件其字节数为(   )。

A、

10

B、

16

C、

40

D、

24

解析:【喵呜刷题小喵解析】:题目中的C++代码是一个简单的程序,它创建了一个文件,并向文件中写入了一些字符。由于文件写入的内容是字符串"Hello, world!",所以文件的大小取决于这个字符串的长度。字符串"Hello, world!"的长度是13个字符,加上一个空字符'\0'(字符串的结束标志),总共是14个字符。每个字符在文件中通常占用一个字节,所以文件的大小应该是14字节。然而,由于文件系统可能会为文件分配额外的空间,所以实际文件大小可能会稍大一些。在给出的选项中,最接近实际文件大小的选项是40字节,因此选择C。但是,需要注意的是,这只是一个近似值,实际文件大小可能会有所不同。

11、下列C++代码输入 1,2,3,4 ,执行后,将输出的是(   )。

A、

1#4#

B、

1#3#

C、

1#2#3#4#

D、

1#2#3#4

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

根据提供的图片,C++代码为:


```cpp
#include
using namespace std;

int main() {
int a, b, c, d;
cin >> a >> b >> c >> d;
if (a > b)
cout << a << "#" << b;
if (c > b)
cout << "#" << c;
if (d > b)
cout << "#" << d;
return 0;
}
```
代码的功能是:输入四个整数a、b、c、d,然后比较它们与b的大小,如果比b大,就在控制台上输出该数字和“#”。

根据题目中给出的输入1,2,3,4,我们可以得到以下比较结果:

* a(1)不大于b(2),所以不会输出;
* c(3)大于b(2),所以会输出“#3”;
* d(4)大于b(2),所以会输出“#4”。

因此,输出为“1#3#4”。

选项A:“1#4#”不正确,因为它没有包括c(3)的输出;
选项B:“1#3#”不正确,因为它没有包括d(4)的输出;
选项D:“1#2#3#4”不正确,因为它包括了a(1)的输出,而a不大于b;

所以,正确答案是选项C:“1#2#3#4”。

12、以下C++代码用于实现每个整数对应的因数,如输入 12 ,则输出 1 2 3 4 6 12 ;如输入 18 ,则输出 1 2 3 6 9 18 。横线处应填入代码是(   )。

A、

if(n%i==0)

B、

if(n/i==0)

C、

if(n%i!=0)

D、

if(n/i!=0)

解析:【喵呜刷题小喵解析】:在C++中,判断一个数是否为另一个数的因数,通常使用取模运算符(%)来判断。如果n能被i整除,即n除以i的余数为0,那么i就是n的因数。因此,选项A中的条件`if(n%i==0)`是正确的。选项B中的条件`if(n/i==0)`判断的是n是否能被i整除,但这不是判断因数的正确方法。选项C和D中的条件都是判断n和i是否不相等,与判断因数无关。

13、某公司新出了一款无人驾驶的小汽车,通过声控智能驾驶系统,乘客只要告诉汽车目的地,车子就能自动选择一条优化路线,告诉乘客后驶达那里。请问下面哪项不是驾驶系统完成选路所必须的。(   )(2023年12月C++四级)

A、

麦克风

B、

扬声器

C、

油量表

D、

传感器

解析:【喵呜刷题小喵解析】无人驾驶小汽车的智能驾驶系统需要完成选路功能,需要用到麦克风(用来接收乘客的目的地输入),扬声器(用来告诉乘客目的地和行驶路线),以及传感器(用来探测车辆周围环境,从而选择最优路线)。而油量表是用来显示车辆剩余油量,与选路功能无关。因此,不是驾驶系统完成选路所必须的是油量表。

14、现代计算机是指电子计算机,它所基于的是(   )体系结构。(2023年12月C++四级)

A 艾伦·图灵

B 冯·诺依曼

C 阿塔纳索夫

D 埃克特-莫克利

解析:【喵呜刷题小喵解析】:现代计算机是基于冯·诺依曼的体系结构。冯·诺依曼是计算机科学的先驱之一,他提出了存储程序的概念,即计算机应该能够存储和执行程序,这是现代计算机的基本工作原理。因此,选项B“冯·诺依曼”是正确答案。其他选项如艾伦·图灵、阿塔纳索夫和埃克特-莫克利虽然都对计算机科学做出了贡献,但他们并不是现代计算机基于的体系结构的主要贡献者。

15、输入一个正整数N,想找出它所有相邻的因数对,比如,输入12,因数对有(1,2)、(2,3)、(3,4)。下面哪段代码找不到所有的因数对?(   )

A、

for(i=1;i<N;i++) if(!(N%i) && !(N%(i+1))) printf("(%d,%d)\n", i, i+1);

B、

for(i=2;i<N;i++) if(!(N%i) && !(N%(i+1))) printf("(%d,%d)\n", i, i+1);

C、

for(i=2;i<N/2;i++) if(!(N%(i-1)) && !(N%i)) printf("(%d,%d)\n", i-1, i);

D、

for(i=1;i<N/2;i++) if(!(N%i) && !(N%(i+1))) printf("(%d,%d)\n", i, i+1);

解析:【喵呜刷题小喵解析】:首先,我们要找出所有相邻的因数对,那么我们应该从2开始,因为1和任何数(除了1本身)都不是相邻的因数对。对于每个i,我们需要检查i和i+1是否是N的因数。如果都是,那么它们就是一个相邻的因数对。

A选项:从1开始,检查到N-1,这会导致检查到N-1和N,这不是一个相邻的因数对,因此A选项是错误的。

B选项:从2开始,检查到N-1,这是正确的开始,但是检查到N-1和N同样不是相邻的因数对,因此B选项是错误的。

C选项:从2开始,检查到N/2,这是正确的开始,但是它检查的是i-1和i,这不是相邻的因数对,因此C选项是错误的。

D选项:从1开始,检查到N/2,这会导致从1检查到N/2,然后从N/2+1检查到N-1,这会漏掉N/2和N这个因数对,因此D选项是正确的。

因此,答案是D选项。

二、判断题

16、C++的内置函数 sort() 支持数组的局部排序。例如 int a={10,9,8,7,6,5,4,3,2,1} ,可以用sort(a,a+5) ,排序成 {6,7,8,9,10,5,4,3,2,1} 。(    )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:C++的内置函数`sort()`用于对数组进行排序,但它不支持数组的局部排序。`sort(a,a+5)`这样的用法在C++中是不合法的,因为`sort()`函数需要两个迭代器作为参数,而不是两个指针。而且,即使这种调用方式在语法上是合法的,它也不会得到期望的结果。`sort(a,a+5)`会尝试对数组的前5个元素进行排序,但后面的元素不会被考虑,所以结果会是{6,7,8,9,10},而不是{6,7,8,9,10,5,4,3,2,1}。因此,题目的描述是错误的。

17、用递归法求 的阶乘,时间复杂度是O(n)。(    )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:递归法求n的阶乘的时间复杂度并不是O(n)。在递归过程中,每次递归调用都会增加递归深度,因此递归法求n的阶乘的时间复杂度实际上是O(n!),这是一个指数级的时间复杂度,而不是O(n)。因此,题目的说法是错误的。

18、[(1,2)*2]*3 在C++中是合法的表达式。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在C++中,表达式[(1,2)*2]*3是合法的。首先,我们需要理解C++中的运算符优先级。在C++中,逗号运算符(,)的优先级是最低的。因此,在表达式(1,2)中,2是最终的结果,整个表达式的结果就是2。然后,2乘以2得到4,最后4再乘以3得到12。因此,这个表达式在C++中是合法的,答案为A。

19、在下面的C++代码中,将对1.txt文件写入 hello 。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:从给出的图片中,我们看不到任何C++代码。因此,无法判断这段代码是否正确。通常,对文件的写入操作需要使用C++的文件流(fstream)库,代码大致如下:

```cpp
#include

int main() {
std::ofstream outfile("1.txt");
if (outfile.is_open()) {
outfile << "hello";
outfile.close();
}
return 0;
}
```

然而,由于题目中并没有给出任何代码,所以我们无法判断这段代码是否正确。因此,答案应选B,即错误。

20、文本文件 1.txt 第1行由 01234 共5个字符组成其间没有空格,当用C++代码正常打开文件成功并执行如下代码以后,第1行长度为5(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:根据题目描述,文本文件1.txt的第1行由01234共5个字符组成,没有空格。使用C++代码正常打开文件后,由于这5个字符没有空格,所以第1行的长度应该仍然是5,而不是小于5。因此,题目中的陈述是正确的。

21、执行C++代码 cout<<(5||2); 后将输出 1 。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在C++中,`||` 是逻辑或运算符。对于逻辑或运算,只要其左侧的操作数为真(非0),则整个表达式的结果就为真,即1。在本题中,`5` 是非0的,所以 `5||2` 的结果就是1。因此,执行 `cout<<(5||2);` 后,输出结果应为1,选项A正确。

22、在C++中,两个字符串相加的运算符为+相当于字符串的合并运算。下面C++代码执行后,将输出chenadai 。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在C++中,两个字符串相加并不使用“+”运算符,而是使用“+”函数或者“+=”运算符进行字符串的连接。题目中的图片没有显示完整的代码,无法判断其是否使用了正确的字符串连接方法。因此,无法确定输出是否为“chenadai”。所以,选项B“错误”是正确的。

23、C++内置函数 sort() 可以对整数、浮点数、字符数组进行从大到小,从小到大,局部排序。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:C++中的sort()函数可以对数组进行排序,但其默认排序方式是从小到大,而非从大到小。同时,它并不局限于整数、浮点数和字符数组,理论上可以对任何类型的数组进行排序,只要这些类型支持小于比较运算符。要实现从大到小的排序,需要自定义比较函数或lambda表达式。因此,题目中的描述不准确,答案为B。

24、小杨最近在准备考GESP,他用的Dev C++来练习和运行程序,所以Dev C++也是一个小型操作系统。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:Dev C++是一个集成开发环境(IDE),用于编写、编译和调试C和C++程序。它不是一个操作系统,操作系统是管理计算机硬件和软件资源的软件,如Windows、Linux等。因此,Dev C++不能被视为一个操作系统。所以,题目的陈述是错误的。

25、任何一个 while 循环都可以转化为等价的 for 循环(   )。

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在大多数编程语言中,while 循环和 for 循环在逻辑上是可以相互转化的。for 循环通常用于有固定迭代次数的场景,而 while 循环用于在满足某个条件时重复执行代码块。通过设定适当的索引变量和条件表达式,任何 while 循环都可以转化为等价的 for 循环。因此,题目的陈述是正确的。

三、实操题

26、小杨的字典

时间限制:1.0 s

内存限制:128.0 MB

问题描述

在遥远的星球,有两个国家 A 国和 B 国,他们使用着不同的语言:A 语言和 B 语言。小杨是 B 国的翻译官,他的工作是将 A 语言的文章翻译成 B 语言的文章。

为了顺利完成工作,小杨制作了一本字典,里面记录了 个 A 语言单词对应的 B 语言单词,巧合的是,这些单词都由地球上的 26 个小写英文字母组成。

小杨希望你写一个程序,帮助他根据这本字典翻译一段 A 语言文章。这段文章由标点符号 !()-[]{}\|;:'",./?<> 和一些 A 语言单词构成,每个单词之间必定由至少一个标点符号分割,你的程序需要把这段话中的所有 A 语言单词替换成它的 B 语言翻译。特别地,如果遇到不在字典中的单词,请使用大写 UNK 来替换它。

例如,小杨的字典中包含 2 个 A 语言单词 abc 和 d ,它们的 B 语言翻译分别为 a 和 def ,那么我们可以把 A语言文章 abc.d.d.abc.abcd. 翻译成 B 语言文章 a.def.def.a.UNK. ,其中,单词 abcd 不在词典内,因此我们需要使用 UNK 来替换它。

输入描述

第一行一个整数N,表示词典中的条目数。保证N≤100。

接下来 行,每行两个用单个空格隔开的字符串A,B,分别表示字典中的一个 A 语言单词以及它对应的 B 语言翻译。保证所有A不重复;保证A和B的长度不超过10。

最后一行一个字符串S,表示需要翻译的 A 语言文章。保证字符串 的长度不超过1000,保证字符串S只包含小写字母以及标点符号 !()-[]{}\|;:'",./?<> 。


输出描述

输出一行,表示翻译后的结果。

特别提醒

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


样例输入 1

2
abc a
d def
abc.d.d.abc.abcd.

样例输出 1

a.def.def.a.UNK.

样例输入 2

3
abc a
d def
abcd xxxx
abc,(d)d!-abc?abcd

样例输出 2

a,(def)def!-a?xxxx

样例输入 3

1
abcdefghij klmnopqrst
!()-[]{}\|;:'",./?<>abcdefghijklmnopqrstuvwxyz

样例输出 3

!()-[]{}\|;:'",./?<>UNK

参考答案:根据题目描述,我们需要编写一个程序,该程序将输入的一段A语言文章中的单词替换为对应的B语言翻译。字典中的单词和翻译通过输入给出,字典中的单词不重复,且长度不超过10。A语言文章由标点符号和小写字母组成,单词之间由至少一个标点符号分割。如果单词不在字典中,则使用UNK替换。我们可以使用Python编写程序,首先读取字典,将字典中的单词和翻译存储在一个字典中。然后读取A语言文章,将文章中的单词替换为对应的B语言翻译,如果单词不在字典中,则替换为UNK。最后将翻译后的文章输出。

解析:【喵呜刷题小喵解析】:
本题是一道字符串处理的题目,需要我们根据给定的字典翻译一段A语言文章。题目中给出了字典和需要翻译的A语言文章,要求我们编写程序实现翻译功能。

首先,我们需要读取字典,将字典中的单词和翻译存储在一个字典中,方便后续查找和替换。字典中的单词和翻译使用空格分隔,可以通过split()函数将字符串拆分成单词和翻译,然后存储在字典中。

接下来,我们需要读取A语言文章,将文章中的单词替换为对应的B语言翻译。可以使用split()函数将文章拆分成单词和标点符号,然后遍历单词列表,如果单词在字典中,则替换为对应的B语言翻译,否则替换为UNK。最后,将翻译后的单词列表和标点符号拼接成翻译后的文章。

最后,我们需要将翻译后的文章输出。由于题目要求输出到标准输出流,我们可以使用print()函数将翻译后的文章输出到控制台。

需要注意的是,题目中要求不使用任何提示信息,因此我们需要确保程序在输入、输出时都不附带任何提示信息。同时,由于题目中限制了输入、输出的格式,我们需要按照题目要求的格式编写程序。

27、田忌赛马

时间限制:1.0 s

内存限制:128.0 MB

问题描述

你要和田忌赛马。你们各自有N匹马,并且要进行N轮比赛,每轮比赛,你们都要各派出一匹马决出胜负。

你的马匹的速度分别为u1,u2,…,uN,田忌的马匹的速度分别为v1,v2,…,vN。田忌会按顺序派出他的马匹,请问你要如何排兵布阵,才能赢得最多轮次的比赛?巧合的是,你和田忌的所有马匹的速度两两不同,因此不可能出现平局。

输入描述

第一行一个整数 。保证1≤N≤5×104

接下来一行N个用空格隔开的整数,依次为u1,u2,…,uN,表示你的马匹们的速度。保证1≤ui≤2N。

接下来一行N个用空格隔开的整数,依次为v1,v2,…,vN,表示田忌的马匹们的速度。保证1≤vi≤2N。

输出描述

输出一行,表示你最多能获胜几轮。

特别提醒

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


样例输入 1

3
1 3 5
2 4 6

样例输出 1

2

样例解释 1

第 1 轮,田忌派出速度为2的马匹,你可以派出速度为3的马匹迎战,本轮你获胜。

第 2 轮,田忌派出速度为4的马匹,你可以派出速度为5的马匹迎战,本轮你获胜。

第 3 轮,田忌派出速度为6的马匹,你可以派出速度为1的马匹迎战,本轮田忌获胜。

如此,你可以赢得 2 轮比赛。


样例输入 2

5
10 3 5 8 7
4 6 1 2 9

样例输出 2

5

参考答案:对于这个问题,我们可以使用贪心算法来解决。首先,将你和田忌的马匹速度分别按照从小到大的顺序进行排序。然后,从速度最小的马匹开始比较,你派出速度比田忌当前马匹速度大的马匹进行比赛,直到你无法派出速度比田忌当前马匹速度大的马匹为止。这样,你就能赢得尽可能多的比赛。

解析:【喵呜刷题小喵解析】:
这个问题是一个典型的贪心算法问题。由于每匹马的速度都是唯一的,所以我们可以按照速度从小到大的顺序对马匹进行排序。然后,从速度最小的马匹开始比较,你派出速度比田忌当前马匹速度大的马匹进行比赛,直到你无法派出速度比田忌当前马匹速度大的马匹为止。这样,你就能赢得尽可能多的比赛。由于每匹马只能参加一次比赛,所以这种方法可以保证你赢得尽可能多的比赛。同时,由于输入规模较小,这种方法的时间复杂度较低,可以在规定的时间内完成。

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

创作类型:
原创

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

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