Minimum Array Sum - Problem

You're tasked with minimizing the sum of an array using two powerful operations with limited uses. Given an integer array nums and three integers k, op1, and op2, you can strategically apply:

  • Operation 1: Divide any element by 2 (rounded up) - usable at most op1 times, once per index
  • Operation 2: Subtract k from any element ≥ k - usable at most op2 times, once per index

Both operations can be applied to the same index, but each operation at most once per position. Your goal is to find the minimum possible sum after optimally applying these operations.

Example: With nums = [2,8,3,19,3], k = 3, op1 = 2, op2 = 2, you could divide 8→4 and 19→10, then subtract 3 from both, resulting in [2,1,3,7,3] with sum 16.

Input & Output

example_1.py — Basic case
$ Input: nums = [2,8,3,19,3], k = 3, op1 = 2, op2 = 2
Output: 16
💡 Note: Apply op1 to 8→4 and 19→10, then apply op2 to both (4→1, 10→7). Final array: [2,1,3,7,3] with sum 16.
example_2.py — Limited operations
$ Input: nums = [2,4,3], k = 3, op1 = 1, op2 = 1
Output: 4
💡 Note: Apply op1 to 4→2, then apply op2 to one element ≥3. Apply op2 to 3→0. Final array: [2,2,0] with sum 4.
example_3.py — No valid op2
$ Input: nums = [1,2,1], k = 5, op1 = 2, op2 = 1
Output: 2
💡 Note: No element ≥ k=5, so op2 cannot be used. Apply op1 to 2→1 and another 1→1. Final array: [1,1,1] with sum 2 (but we started with sum 4, so apply op1 to both 2→1). Actually: [1,1,1] sum=3, but we can only reduce the 2, so [1,1,1] giving sum 3. Wait - let me recalculate: apply op1 to the 2→1, giving [1,1,1] with sum 3. We still have 1 op1 left but using it on any 1 gives 1. So minimum sum is 3.

Constraints

  • 1 ≤ nums.length ≤ 100
  • 1 ≤ nums[i] ≤ 105
  • 1 ≤ k ≤ 105
  • 0 ≤ op1, op2 ≤ nums.length
  • Each operation can be applied at most once per index

Visualization

Tap to expand
Shopping Cart Discount OptimizationItem: $19No coupon: $19Half-price: $10Fixed(-$3): $16Best ChoiceHalf-price first:$19→$10→$7Optimal: $7Coupon InventoryHalf-Price: 2 leftFixed Discount: 2 leftUse wisely!Dynamic ProgrammingState: (item, half_coupons, fixed_coupons)Cache: Avoid recalculating same statesTime: O(n × op1 × op2)vs O(4^n) brute forceDecision Process for Each ItemNo OpHalfFixedBothChoose minimum cost option while respecting coupon limits
Understanding the Visualization
1
Analyze each item
For each item, consider: no discount, half-price coupon, fixed discount, or both coupons
2
Track coupon usage
Keep count of remaining coupons of each type as you decide
3
Consider operation order
When using both coupons, try both orders (half-price then fixed, or fixed then half-price)
4
Use memoization
Cache results for each state (position, coupons_remaining) to avoid recalculation
Key Takeaway
🎯 Key Insight: Use dynamic programming with memoization to efficiently explore all operation combinations, considering that each element has exactly 4 possible outcomes and caching results based on remaining operation counts.
Asked in
Google 42 Amazon 38 Meta 35 Microsoft 28 Apple 22
38.5K Views
Medium-High Frequency
~25 min Avg. Time
1.5K Likes
Ln 1, Col 1
Smart Actions
💡 Explanation
AI Ready
💡 Suggestion Tab to accept Esc to dismiss
// Output will appear here after running code
Code Editor Closed
Click the red button to reopen