题目解析: 英雄决斗的最大胜利次数 | 豆包Marscode Al刷题

151 阅读3分钟

问题描述

小U和小F正在进行一场由 n 轮组成的英雄决斗比赛。在每一轮中,小U和小F各自从他们的英雄队伍中选出一位英雄进行对决,英雄的能力值将决定比赛的胜负,能力值高者获胜。小U已经按照固定的能力顺序 1,2,3,…,n 安排了他的英雄出场顺序。

小F希望通过调整他的英雄出场顺序,最大化他的获胜轮数。请帮助小 F 确定一个最佳的出场顺序,以获得最多的胜利。

#输入说明

  • number: 一个整数,表示比赛的总轮数 nn。
  • heroes: 一个长度为 nn 的正整数数组,表示小 F 的每个英雄的能力值。

#输出

  • 返回一个整数,表示小 F 可以获得的最大胜利轮数。

解题思路

题目分析

根据题目我们我们可以知道,小U和小F要进行比赛,每个人出 number 个数量的英雄,每个英雄有不同的能力值,其中有以下 2 个要点需要注意:

  1. 一个英雄 a 能赢过另一个英雄 b 当且仅当a的能力值大于b的能力值;
  2. 小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]

image.png

由此,我们可以得出以下解题思路

  • 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;
}

个人思考与分析

这道题主要就是一个思路问题,但是应该也有别的方法,但是还是不要想太复杂就会好解答很多。

如果以上有什么写的不好或者不对的地方也欢迎大家批评指正,非常感谢!