64.英雄决斗的最大胜利次数|Marscode AI刷题

93 阅读2分钟

1.题目

问题描述

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

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

输入说明

  • number: 一个整数,表示比赛的总轮数 n

    n

  • heroes: 一个长度为 n 的正整数数组,表示小 F 的每个英雄的能力值。

    n

输出

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

测试样例

样例1:

输入:number = 7, heroes = [10, 1, 1, 1, 5, 5, 3]

输出:4

样例2:

输入:number = 5, heroes = [1, 1, 1, 1, 1]

输出:0

样例3:

输入:number = 6, heroes = [9, 4, 7, 3, 2, 6]

输出:6

2.思路

先将小F战队的英雄按战力排序,遍历小U的所有英雄,找到能打败小U战队英雄的第一个小F战队的英雄。

  • 排序:将小F的英雄按照能力值从小到大排序。

  • 双指针法:使用两个指针,一个指向小F的英雄队伍,另一个指向小U的英雄(按 1 到 n 排序):

    • 小F的英雄依次与小U的英雄对战,如果小F的当前英雄能力值大于小U当前英雄能力值,则小F获胜,并且两个指针都移动。
    • 如果小F的当前英雄能力值小于等于小U的当前英雄能力值,则小F无法获胜,指针只移动到小F队伍的下一个英雄。
  • 统计胜利:每当小F赢得一轮比赛,胜利数加 1。

3.代码

#include <iostream>
#include <vector>
#include <algorithm>

int solution(int number, std::vector<int> heroes) {
    // Please write your code here
    sort(heroes.begin(), heroes.end());
    int cnt = 0;
    int j = 0; // 小F当前英雄的下标
    int i = 1; // 小U当前英雄的能力
    while (j < number) {
        if (heroes[j] > i) { //小F可以打过当前小U的英雄
            j++;
            i++;
            cnt++;
        }else {
            j++;
        }
    }
    return cnt;
}

int main() {
    //  You can add more test cases here
    std::vector<int> heroes1 = {10,1,1,1,5,5,3};
    std::vector<int> heroes2 = {1,1,1,1,1};
    std::vector<int> heroes3 = {1,2,3,4,5,6,7,8,9,10};

    std::cout << (solution(7, heroes1) == 4) << std::endl;
    std::cout << (solution(5, heroes2) == 0) << std::endl;
    std::cout << (solution(10, heroes3) == 9) << std::endl;

    return 0;
}

注意:在定义变量时要初始化