LeetCode in Kotlin

2212. Maximum Points in an Archery Competition

Medium

Alice and Bob are opponents in an archery competition. The competition has set the following rules:

  1. Alice first shoots numArrows arrows and then Bob shoots numArrows arrows.
  2. The points are then calculated as follows:
    1. The target has integer scoring sections ranging from 0 to 11 inclusive.
    2. For each section of the target with score k (in between 0 to 11), say Alice and Bob have shot ak and bk arrows on that section respectively. If ak >= bk, then Alice takes k points. If ak < bk, then Bob takes k points.
    3. However, if ak == bk == 0, then nobody takes k points.

You are given the integer numArrows and an integer array aliceArrows of size 12, which represents the number of arrows Alice shot on each scoring section from 0 to 11. Now, Bob wants to maximize the total number of points he can obtain.

Return the array bobArrows which represents the number of arrows Bob shot on each scoring section from 0 to 11. The sum of the values in bobArrows should equal numArrows.

If there are multiple ways for Bob to earn the maximum total points, return any one of them.

Example 1:

Input: numArrows = 9, aliceArrows = [1,1,0,1,0,0,2,1,0,1,2,0]

Output: [0,0,0,0,1,1,0,0,1,2,3,1]

Explanation: The table above shows how the competition is scored. Bob earns a total point of 4 + 5 + 8 + 9 + 10 + 11 = 47. It can be shown that Bob cannot obtain a score higher than 47 points.

Example 2:

Input: numArrows = 3, aliceArrows = [0,0,1,0,0,0,0,0,0,0,0,2]

Output: [0,0,0,0,0,0,0,0,1,1,1,0]

Explanation: The table above shows how the competition is scored. Bob earns a total point of 8 + 9 + 10 = 27. It can be shown that Bob cannot obtain a score higher than 27 points.

Constraints:

Solution

class Solution {
    private val ans = IntArray(12)
    private val ans1 = IntArray(12)
    private var max = 0
    fun maximumBobPoints(numArrows: Int, aliceArrows: IntArray): IntArray {
        solve(numArrows, aliceArrows, 11, 0)
        return ans1
    }

    private fun solve(numArrows: Int, aliceArrows: IntArray, index: Int, sum: Int) {
        if (numArrows <= 0 || index < 0) {
            if (max < sum) {
                max = sum
                ans1[0] = Math.max(ans[0], ans[0] + numArrows)
                System.arraycopy(ans, 1, ans1, 1, 11)
            }
            return
        }
        if (aliceArrows[index] + 1 <= numArrows) {
            ans[index] = aliceArrows[index] + 1
            solve(numArrows - (aliceArrows[index] + 1), aliceArrows, index - 1, sum + index)
            ans[index] = 0
        }
        solve(numArrows, aliceArrows, index - 1, sum)
    }
}