Problem Link

Description


You are playing a solitaire game with three piles of stones of sizes aā€‹ā€‹ā€‹ā€‹ā€‹ā€‹, b,ā€‹ā€‹ā€‹ā€‹ā€‹ā€‹ and cā€‹ā€‹ā€‹ā€‹ā€‹ā€‹ respectively. Each turn you choose two different non-empty piles, take one stone from each, and add 1 point to your score. The game stops when there are fewer than two non-empty piles (meaning there are no more available moves).

Given three integers aā€‹ā€‹ā€‹ā€‹ā€‹, b,ā€‹ā€‹ā€‹ā€‹ā€‹ and cā€‹ā€‹ā€‹ā€‹ā€‹, return the maximum score you can get.

Ā 

Example 1:

Input: a = 2, b = 4, c = 6
Output: 6
Explanation: The starting state is (2, 4, 6). One optimal set of moves is:
- Take from 1st and 3rd piles, state is now (1, 4, 5)
- Take from 1st and 3rd piles, state is now (0, 4, 4)
- Take from 2nd and 3rd piles, state is now (0, 3, 3)
- Take from 2nd and 3rd piles, state is now (0, 2, 2)
- Take from 2nd and 3rd piles, state is now (0, 1, 1)
- Take from 2nd and 3rd piles, state is now (0, 0, 0)
There are fewer than two non-empty piles, so the game ends. Total: 6 points.

Example 2:

Input: a = 4, b = 4, c = 6
Output: 7
Explanation: The starting state is (4, 4, 6). One optimal set of moves is:
- Take from 1st and 2nd piles, state is now (3, 3, 6)
- Take from 1st and 3rd piles, state is now (2, 3, 5)
- Take from 1st and 3rd piles, state is now (1, 3, 4)
- Take from 1st and 3rd piles, state is now (0, 3, 3)
- Take from 2nd and 3rd piles, state is now (0, 2, 2)
- Take from 2nd and 3rd piles, state is now (0, 1, 1)
- Take from 2nd and 3rd piles, state is now (0, 0, 0)
There are fewer than two non-empty piles, so the game ends. Total: 7 points.

Example 3:

Input: a = 1, b = 8, c = 8
Output: 8
Explanation: One optimal set of moves is to take from the 2nd and 3rd piles for 8 turns until they are empty.
After that, there are fewer than two non-empty piles, so the game ends.

Ā 

Constraints:

  • 1 <= a, b, c <= 105

Solution


C++

class Solution {
public:
    int maximumScore(int a, int b, int c) {
        if (a < b)
            return maximumScore(b, a, c);
        
        if (b < c)
            return maximumScore(a, c, b);
        
        return b == 0 ? 0 : 1 + maximumScore(a-1, b-1, c);
    }
};

Python3

from heapq import heappush, heappop, heapify
 
class Solution:
    # heap
    def maximumScore(self, a: int, b: int, c: int) -> int:
        return min((a+b+c)//2 , a+b+c - max(a,b,c))
        res = 0
        stones = [-a,-b,-c]
        heapify(stones)
        
        while abs(stones[0]) > 0 and abs(stones[1]) > 0:
            first = heappop(stones) + 1
            second = heappop(stones) + 1
            
            heappush(stones, first)
            heappush(stones, second)
            
            res += 1
            
        return res