27.游戏英雄升级潜力评估
问题描述
小U在一款挂机游戏中拥有n个英雄。游戏中有一种历练升级机制,每天可以选择两个英雄进行历练,如果两位英雄的等级相同,则他们的等级都不会改变。如果英雄等级不同,那么等级较高的英雄会增加1级,而等级较低的英雄则保持不变。
小U希望至少有一个英雄能够达到2000000000000000级,他想知道有多少英雄有潜力通过历练达到这个等级。
一、思路解析
- 目标明确:给定
n个英雄的初始等级信息,通过特定的历练升级机制(等级相同则不变,等级不同则高等级英雄升 1 级),判断有多少英雄有潜力达到2000000000000000级。这里的思路是先找出初始等级中的最小值,然后认为除了初始等级为最小值的英雄外,其他英雄都有通过不断与其他非最小等级英雄历练而提升等级的潜力,从而有可能达到目标等级。
二、解题步骤
- 找出初始等级中的最小值:
- 遍历输入的英雄等级向量
u,通过比较每个元素与当前记录的最小值min,不断更新min的值,使其最终成为所有英雄初始等级中的最小值。
- 遍历输入的英雄等级向量
- 创建与最小值相同等级的向量并比较:
- 创建一个新的向量
v,其大小与输入向量u相同,且所有元素都初始化为找到的最小值min。 - 将新创建的向量
v与输入向量u进行比较,如果两者完全相同,说明所有英雄的初始等级都一样,那么没有英雄有潜力提升等级达到目标值,此时返回0。
- 创建一个新的向量
- 统计与最小值相同等级的英雄数量:
- 再次遍历输入向量
u,统计其中初始等级等于最小值min的英雄个数,记为count。
- 再次遍历输入向量
- 计算有潜力的英雄数量:
- 用英雄的总数
n(即输入向量u的大小)减去count,得到的结果就是有潜力通过历练达到目标等级的英雄数量,将其返回。
- 用英雄的总数
三、代码分析
(一)函数定义部分
int solution(int n, vector<int> u) {
// write code here
int min = 99999999;
for (auto &x : u) {
if (min > x)
min = x;
}
vector<int> v(n, min);
if (v == u) {
return 0;
}
int count = 0;
for (auto &x : u) {
if (x == min)
count++;
}
return u.size() - count;
}
int solution(int n, vector<int> u):定义了一个名为solution的函数,它接受两个参数。n表示英雄的总数,u是一个vector类型的参数,用于存储各个英雄的初始等级。函数的任务是根据给定的英雄初始等级信息,计算出有潜力达到目标等级的英雄数量。int min = 99999999;:在函数内部,首先初始化一个变量min为一个较大的值(这里假设初始等级不会超过这个值),用于后续在遍历u时找到其中的最小值。
(二)寻找最小值部分
for (auto &x : u) {
if (min > x)
min = x;
}
for (auto &x : u):这是一个基于范围的for循环,用于遍历向量u中的每个元素。这里使用引用&是为了避免在遍历过程中进行不必要的拷贝操作,提高效率。if (min > x):在循环内部,将当前遍历到的元素x与min进行比较,如果x小于min,则更新min的值为x,这样遍历完整个向量u后,min就成为了u中所有元素的最小值。
(三)创建并比较向量部分
vector<int> v(n, min);
if (v == u) {
return 0;
}
vector<int> v(n, min);:创建一个新的向量v,它的大小为n(与输入向量u的大小相同),并且所有元素都初始化为刚刚找到的最小值min。if (v == u):将新创建的向量v与输入向量u进行比较,如果两个向量完全相等,这意味着所有英雄的初始等级都相同,根据游戏的历练机制,这种情况下没有英雄有潜力提升等级达到目标值,所以直接返回0。
(四)统计与最小值相同等级的英雄数量部分
int count = 0;
for (auto &x : u) {
if (x == min)
count++;
}
int count = 0;:初始化一个变量count为0,用于统计输入向量u中初始等级等于最小值min的英雄个数。for (auto &x : u):再次使用基于范围的for循环遍历向量u。if (x == min):在循环内部,当遍历到的元素x等于最小值min时,就将count的值增加1。
(五)计算有潜力的英雄数量并返回部分
return u.size() - count;
- 用输入向量
u的大小(也就是英雄的总数n)减去count(即初始等级为最小值的英雄个数),得到的结果就是有潜力通过历练达到目标等级的英雄数量,最后通过return语句将这个结果返回给函数的调用者。
四、知识总结
(一)C++ 容器知识
- 在代码中使用了
vector容器来存储英雄的初始等级信息。vector是 C++ 标准模板库(STL)中的一种动态数组类型,它可以根据需要自动调整大小,方便地存储和操作一组同类型的数据元素。在本题中,通过vector<int>定义了一个存储整数类型元素的向量。
(二)循环遍历知识
- 运用了基于范围的
for循环来遍历vector容器中的元素。这种循环方式语法简洁,不需要显式地指定循环变量的起始值、终止值和步长等信息,直接通过for (auto &x : u)的形式就可以遍历容器u中的每个元素,并且可以通过引用&来避免不必要的拷贝操作,提高代码的运行效率。
(三)比较和赋值操作知识
- 在代码中涉及到了变量之间的比较操作(如
if (min > x))和赋值操作(如min = x)。比较操作用于判断两个值的大小关系,以便根据不同的情况执行相应的逻辑。赋值操作则用于更新变量的值,使其满足程序运行的需要。
(四)函数定义与调用知识
- 定义了一个名为
solution的函数来实现具体的计算功能,函数接受特定的参数并返回一个结果。在main函数中通过调用solution函数并传入不同的参数来验证函数的正确性。函数定义和调用是 C++ 程序中组织代码和实现功能的重要手段,通过合理地定义函数可以使代码结构更加清晰,便于维护和扩展。
(五)逻辑判断知识
- 在代码中有多处逻辑判断的应用,如判断是否找到了更小的元素来更新最小值(
if (min > x))、判断两个向量是否相等(if (v == u))以及判断元素是否等于最小值(if (x == min))等。逻辑判断是根据不同的条件执行相应的程序逻辑的关键,通过准确的逻辑判断可以使程序按照预期的方式运行。