LeetCode-1753. Pontuação máxima da remoção de pedras [médio] -Análise e código (Java)

LeetCode-1753. Pontuação máxima da remoção de pedras [Pontuação máxima da remoção de pedras] [Médio] -Análise e código [Java]

1. Tópico

Você está jogando um jogo para um jogador com três pilhas de pedras de tamanho a, be c à sua frente.
Cada rodada você tem que pegar uma pedra de duas pilhas não vazias diferentes e adicionar 1 ponto à pontuação. Quando há duas ou mais pilhas vazias, o jogo para.
Dê a você três inteiros a, b e c e retorne a pontuação máxima que pode ser obtida.

Exemplo 1:

输入:a = 2, b = 4, c = 6
输出:6
解释:石子起始状态是 (2, 4, 6) ,最优的一组操作是:
- 从第一和第三堆取,石子状态现在是 (1, 4, 5)
- 从第一和第三堆取,石子状态现在是 (0, 4, 4)
- 从第二和第三堆取,石子状态现在是 (0, 3, 3)
- 从第二和第三堆取,石子状态现在是 (0, 2, 2)
- 从第二和第三堆取,石子状态现在是 (0, 1, 1)
- 从第二和第三堆取,石子状态现在是 (0, 0, 0)
总分:6 分 。

Exemplo 2:

输入:a = 4, b = 4, c = 6
输出:7
解释:石子起始状态是 (4, 4, 6) ,最优的一组操作是:
- 从第一和第二堆取,石子状态现在是 (3, 3, 6)
- 从第一和第三堆取,石子状态现在是 (2, 3, 5)
- 从第一和第三堆取,石子状态现在是 (1, 3, 4)
- 从第一和第三堆取,石子状态现在是 (0, 3, 3)
- 从第二和第三堆取,石子状态现在是 (0, 2, 2)
- 从第二和第三堆取,石子状态现在是 (0, 1, 1)
- 从第二和第三堆取,石子状态现在是 (0, 0, 0)
总分:7 分 。

Exemplo 3:

输入:a = 1, b = 8, c = 8
输出:8
解释:最优的一组操作是连续从第二和第三堆取 8 回合,直到将它们取空。
注意,由于第二和第三堆已经空了,游戏结束,不能继续从第一堆中取石子。

incitar:

  • 1 <= a, b, c <= 10 ^ 5

Fonte: LeetCode (LeetCode)
Link: https://leetcode-cn.com/problems/maximum-score-from-removing-stones Os
direitos autorais são propriedade da LeetCode . Para reimpressões comerciais, favor contatar a autorização oficial Para reimpressões não comerciais, favor indicar a fonte.

Dois, análise e código

1. Simulação

(1) Pensando

Para simular o processo de retirada das pedras, para a conveniência da discussão, as pilhas de pedras podem ser reordenadas de menos para mais. Então, a ordem de pegar as pedras após a classificação é:

  • 1) Quando a + b> c, pegue as pedras de a e b;
  • 2) Pegue as pedras de bec;
  • 3) Pegue as pedras de a e c.

(2) Código

class Solution {
    
    
    public int maximumScore(int a, int b, int c) {
    
    
        int[] num = new int[]{
    
    a, b, c};
        Arrays.sort(num);//排序后,num0 <= num1 <= num2
        int ans = 0;
        while (num[0] > 0 && num[0] + num[1] > num[2]) {
    
    
            ans++;
            num[0]--;
            num[1]--;
        }
        while (num[2] > 0 && num[1] > 0) {
    
    
            ans++;
            num[2]--;
            num[1]--;
        }
        while (num[2] > 0 && num[0] > 0) {
    
    
            ans++;
            num[2]--;
            num[0]--;
        }
        return ans;
    }
}

(3. Resultados

Tempo de execução: 5 ms, superando 42,54% dos usuários
em todos os envios Java ; consumo de memória: 35,2 MB, superando 71,22% dos usuários em todos os envios Java.

2. Cálculo direto

(1) Pensando

O processo de simulação acima é simplificado para cálculo direto.

(2) Código

class Solution {
    
    
    public int maximumScore(int a, int b, int c) {
    
    
        int[] num = new int[]{
    
    a, b, c};
        Arrays.sort(num);//排序后,num0 <= num1 <= num2
        int ans = 0;
        if (num[0] + num[1] > num[2]) {
    
    
            int get = (num[0] + num[1] - num[2]) >> 1;
            ans += get;
            num[0] -= get;
            num[1] -= get;
        }
        ans += Math.min(num[0] + num[1], num[2]);
        return ans;
    }
}

(3. Resultados

Tempo de execução: 0 ms, superando 100,00% dos usuários
em todos os envios Java ; consumo de memória: 35,5 MB, superando 25,97% dos usuários em todos os envios Java.

Tres, outro

Nenhuma coisa.

Acho que você gosta

Origin blog.csdn.net/zml66666/article/details/114108069
Recomendado
Clasificación