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.