小C不怕困难 | 豆包MarsCode AI刷题

60 阅读2分钟

题解:小C不怕困难

题目分析

我们需要计算出小C能够累计提升的勇气值的最大值
而勇气值是当小C战斗力小于怪物的战斗力的时候触发被动技能,勇气值会增加之间的差值,同时战斗力提升到怪物的战斗力。而当小C战斗力更高的时候,不会触发技能,但是战斗力会下降到和怪物一样。
而小C可以自由决定战斗顺序。

代码思路

因为小C可以自由决定顺序,可以直接使用代码排序功能,不用在意原来元素所在位置。同时为了计算最大值,考虑先与战斗力最强的怪物战斗,获得最大勇气值,之后与战斗力最低的怪物战斗,以提高下一次的战斗力差值。如此循环到战斗完每个怪物。

代码实现

数据结构

使用数组进行存储每个怪物的战斗力。

算法步骤

首先对于怪物战斗力数组进行排序
排序后的数组为升序,使用变量currentPower进行记录当前的小C的战斗力。之后判断小C当前的战斗力和将要面对的怪物的战斗力的大小,判断勇气值是否增加以及增加多少。之后把currentPower的数值设定为当前面对怪物的战斗值,继续循环。可以将面对可选择的最大的步骤和最小的步骤合二为一,使用i和n-i-1进行表示。由于已知数组长度n,所以可以利用索引值两边互相逼近,假设索引值为i,则当n-i-1小于等于i时停止循环,返回累加的勇气值数据。

思路改进

由于如此循环是固定的操作,因此我们可以直接把两个步骤合二为一,由于数组已经经过排序,当i小于等于n/2的时候,一定有n-1-i>i,则可以直接加上a[n-1-i]与当前战斗值的差值,之后直接设定当前战斗值。
如下图代码,是目前想到的最简单的方法进行计算。

 Arrays.sort(a);
        int currentPower = 0;
        int currentCourage = 0;

        for (int i = 0; i <= n / 2; i++) {
            currentCourage += a[n - 1 - i] -currentPower;
            currentPower = a[i];
        }

        return currentCourage;

总结思考

虽然这一题的难度是难,但分析过后知道思路简单,利用索引值直接对数组内容进行逼近,符合数组易查询获取数值的特点。可以利用已知的数学知识对过程方法进行改进,使得代码的效率得到提高。