Skip to content

3207. Maximum Points After Enemy Battles

You are given an integer array enemyEnergies denoting the energy values of various enemies.

You are also given an integer currentEnergy denoting the amount of energy you have initially.

You start with 0 points, and all the enemies are unmarked initially.

You can perform either of the following operations zero or multiple times to gain points:

  • Choose an

unmarked

enemy,

i

, such that

currentEnergy >= enemyEnergies[i]

. By choosing this option:

  • You gain 1 point.
  • Your energy is reduced by the enemy's energy, i.e. currentEnergy = currentEnergy - enemyEnergies[i].

  • If you have

at least

1 point, you can choose an

unmarked

enemy,

i

. By choosing this option:

  • Your energy increases by the enemy's energy, i.e. currentEnergy = currentEnergy + enemyEnergies[i].
  • The enemy i is marked.

Return an integer denoting the maximum points you can get in the end by optimally performing operations.

Example 1:

Input: enemyEnergies = [3,2,2], currentEnergy = 2

Output: 3

Explanation:

The following operations can be performed to get 3 points, which is the maximum:

  • First operation on enemy 1: points increases by 1, and currentEnergy decreases by 2. So, points = 1, and currentEnergy = 0.
  • Second operation on enemy 0: currentEnergy increases by 3, and enemy 0 is marked. So, points = 1, currentEnergy = 3, and marked enemies = [0].
  • First operation on enemy 2: points increases by 1, and currentEnergy decreases by 2. So, points = 2, currentEnergy = 1, and marked enemies = [0].
  • Second operation on enemy 2: currentEnergy increases by 2, and enemy 2 is marked. So, points = 2, currentEnergy = 3, and marked enemies = [0, 2].
  • First operation on enemy 1: points increases by 1, and currentEnergy decreases by 2. So, points = 3, currentEnergy = 1, and marked enemies = [0, 2].

Example 2:

Input: enemyEnergies = [2], currentEnergy = 10

Output: 5

Explanation:

Performing the first operation 5 times on enemy 0 results in the maximum number of points.

Constraints:

  • 1 <= enemyEnergies.length <= 105
  • 1 <= enemyEnergies[i] <= 109
  • 0 <= currentEnergy <= 109

Solution:

class Solution {
    public long maximumPoints(int[] enemyEnergies, int currentEnergy) {
        long x = 0;
        Arrays.sort(enemyEnergies);
        int j = enemyEnergies.length - 1;
        int i = 0;
        // Iterate while i is less than or equal to j
        while (i <= j) {
            // If the current energy is sufficient to defeat the enemy at position i
            if (currentEnergy >= enemyEnergies[i]) {
                // Calculate how many enemies of this type can be defeated and add to points
                x += currentEnergy / enemyEnergies[i];
                // Update the remaining energy after defeating the enemies
                currentEnergy = currentEnergy % enemyEnergies[i];
            } else {
                // If current energy is not enough for the enemy at position i,
                // Increase the energy by adding the energy of the enemy at position j
                currentEnergy += enemyEnergies[j--];
            }
            // If no points are gained, break the loop early
            if (x == 0) break;
        }
        return x;
    }
}