小U和小F正在进行一场比赛,比赛的核心规则如下: 1.比赛总共有n轮 2.小U的英雄出场顺序已经固定为第i轮他的英雄能力值是i 3.小F可以热议调整他的英雄出场顺序。以最大化获胜轮数 4.每轮的胜负规则是:出场英雄的能力值高者获胜,能力值相同视为小U获胜 5.目标是求小F能获胜的最多轮数 这道题目的关键解决方法是贪心算法:小F希望以最低的代价(即尽小的能力值)战胜小U的每个英雄,因此对于小U的英雄能力值U[i],小F需要选择能力值最接近且大于U[i]的英雄来对战。如果没有这样的英雄,则放弃本轮比赛。
java代码实现如下
代码运行解析: 1.初始化小U的英雄队伍 2.排序小F的英雄队伍:为了方便选择能力最小但可以战胜小U英雄的英雄,将heroes按升序排序 3.双指针: 指针一:用i遍历小U的英雄队伍Uheroes 指针二:用fPoint遍历排序后的小F的英雄队伍heroes 对每个Uheroes[i],通过fPoint查找最小的heroes[fPoint]>Uheroes[i] 4.胜利判定: 如果找到相对应的heroes[fPoint],则小F获胜,指针fPoint后移 如果没找到,则小F放弃本轮比赛。
个人心得 通过这些天的做题,我发现贪心思想(即通过每次选择最小的符合条件的元素)在解决问题时非常有用。贪心策略能够在排序后简单、高效地处理问题,尤其适用于优化组合问题。它通过每次选择局部最优解,最终往往能够得到全局最优解,是一种应用广泛的算法。贪心算法简单而高效,能够在很多实际场景中减少计算复杂度,特别是在解决一些需要大量计算的组合问题时,能够显著提升程序的性能。
此外,这道题也让我深刻感受到指针在Java中的重要性,特别是在使用双指针时。双指针技巧能够有效地解决匹配类问题,比如在这道题中,一个指针遍历小U的英雄,而另一个指针则用于定位小F英雄队伍中符合条件的英雄。通过这种方法,不仅避免了多次循环的重复计算,还极大提高了代码的可读性和简洁性。双指针技术简化了代码逻辑,并且在遍历过程中避免了不必要的冗余运算,从而显著提升了程序的性能和运行效率。