问题描述
小U和小F正在进行一场由 n 轮组成的英雄决斗比赛。在每一轮中,小U和小F各自从他们的英雄队伍中选出一位英雄进行对决,英雄的能力值将决定比赛的胜负,能力值高者获胜。小U已经按照固定的能力顺序 1,2,3,…,n 安排了他的英雄出场顺序。
小F希望通过调整他的英雄出场顺序,最大化他的获胜轮数。请帮助小 F 确定一个最佳的出场顺序,以获得最多的胜利。
#输入说明
number: 一个整数,表示比赛的总轮数 nn。heroes: 一个长度为 nn 的正整数数组,表示小 F 的每个英雄的能力值。
#输出
- 返回一个整数,表示小 F 可以获得的最大胜利轮数。
解题思路
题目分析
根据题目我们我们可以知道,小U和小F要进行比赛,每个人出 number 个数量的英雄,每个英雄有不同的能力值,其中有以下 2 个要点需要注意:
- 一个英雄 a 能赢过另一个英雄 b 当且仅当a的能力值大于b的能力值;
- 小U的英雄出场顺序和能力值已经确定,即
1,2,3,...,number;
由此,我们需要做的是根据题目给我们的小F的英雄能力值,选择一个英雄出场顺序,使得小F能够赢得更多次。
思路详解
根据题意,如果我们要赢得更多场次的比赛的话,最好的打算就是用自己的小能力值的英雄去赢对方小能力的英雄,就是说,如果我有能力值4和5的英雄,我会优先选择4去赢对方能力值为3的英雄,而不是5。因此,对于已经有顺序的小U的能力值,我们可以先对小F的英雄进行排序,然后依次比较小F能够赢下小U几场。
接下来通过以下示例进行图解
number = 7, heroes = [10, 1, 1, 1, 5, 5, 3]
由此,我们可以得出以下解题思路
- 对
heros进行排序,并定义总数变量ans - 双重循环,外循环是小U的英雄能力值,内循环是小F的英雄能力值,在内循环中,若有一个值大于外循环此时的值时,匹配成功,更新总数
ans,然后跳出内循环,继续外循环 - 遍历完毕,返回结果
代码详解
- 定义总数变量
int ans = 0;
- 对小F的英雄能力值进行升序排序
sort(heroes.begin(), heroes.end());
- 双重循环遍历
int j = 0;
for(int i = 0; i < number; i++) {
for(; j < number; j++) {
if(heroes[j] > i + 1) {
ans++;
j++;
break;
}
}
}
完整代码展示
以下使用c++编写的过题代码
#include <bits/stdc++.h>
using namespace std;
int solution(int number, vector<int> heroes) {
// Please write your code here
int ans = 0; // 记录总数
// 先对英雄的能力值进行排序
sort(heroes.begin(), heroes.end());
int j = 0;
for(int i = 0; i < number; i++) {
for(; j < number; j++) {
if(heroes[j] > i + 1) {
ans++;
j++;
break;
}
}
}
return ans;
}
int main() {
// You can add more test cases here
vector<int> heroes1 = {10,1,1,1,5,5,3};
vector<int> heroes2 = {1,1,1,1,1};
vector<int> heroes3 = {1,2,3,4,5,6,7,8,9,10};
cout << (solution(7, heroes1) == 4) << endl;
cout << (solution(5, heroes2) == 0) << endl;
cout << (solution(10, heroes3) == 9) << endl;
return 0;
}
个人思考与分析
这道题主要就是一个思路问题,但是应该也有别的方法,但是还是不要想太复杂就会好解答很多。
如果以上有什么写的不好或者不对的地方也欢迎大家批评指正,非常感谢!