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;
}
注意:在定义变量时要初始化