Medium
Alice and Bob are opponents in an archery competition. The competition has set the following rules:
numArrows
arrows and then Bob shoots numArrows
arrows.0
to 11
inclusive.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.ak == bk == 0
, then nobody takes k
points.2
arrows on the section with score 11
, then Alice takes 11
points. On the other hand, if Alice shot 0
arrows on the section with score 11
and Bob shot 2
arrows on that same section, then Bob takes 11
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:
1 <= numArrows <= 105
aliceArrows.length == bobArrows.length == 12
0 <= aliceArrows[i], bobArrows[i] <= numArrows
sum(aliceArrows[i]) == numArrows
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)
}
}