一、单选题
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
参考答案:对于这个问题,我们可以使用贪心算法来解决。首先,将你和田忌的马匹速度分别按照从小到大的顺序进行排序。然后,从速度最小的马匹开始比较,你派出速度比田忌当前马匹速度大的马匹进行比赛,直到你无法派出速度比田忌当前马匹速度大的马匹为止。这样,你就能赢得尽可能多的比赛。
解析:【喵呜刷题小喵解析】:
这个问题是一个典型的贪心算法问题。由于每匹马的速度都是唯一的,所以我们可以按照速度从小到大的顺序对马匹进行排序。然后,从速度最小的马匹开始比较,你派出速度比田忌当前马匹速度大的马匹进行比赛,直到你无法派出速度比田忌当前马匹速度大的马匹为止。这样,你就能赢得尽可能多的比赛。由于每匹马只能参加一次比赛,所以这种方法可以保证你赢得尽可能多的比赛。同时,由于输入规模较小,这种方法的时间复杂度较低,可以在规定的时间内完成。
喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!