1753. 移除石子的最大得分
Posted 易小顺
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1753. 移除石子的最大得分相关的知识,希望对你有一定的参考价值。
算法记录
LeetCode 题目:
你正在玩一个单人游戏,面前放置着大小分别为 a、b 和 c 的 三堆 石子。
每回合你都要从两个 不同的非空堆 中取出一颗石子,并在得分上加 1 分。当存在 两个或更多 的空堆时,游戏停止。
给你三个整数 a 、b 和 c ,返回可以得到的 最大分数 。
说明
一、题目
输入: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 分 。
二、分析
- 首先明确该题目的意思是需要每次从两堆中取出各一个,也就是里面的个数会各减一。
- 大家都知道短板效益,这道题也需要从最少的石堆进行入手,通过最小的去带动大的。
- 题意只要两个堆为
0
了,整个游戏就结束了,也就是说我们可先处理掉一个堆,另外两个堆取最少的就可以了。 - 我们可以模拟两种情况:一是最小堆加上次小堆比最大的堆要少,也就是说最小堆和最大堆同时开始减,最后的数量还是比两外一个要多,这时候直接最小加上次小即可。二是最小堆加上次小堆比最大的堆要多,可以先将两个大堆进行补齐,在同时经过最小堆来进行下降操作,最后在加上次小堆即可。
class Solution {
public int maximumScore(int a, int b, int c) {
int temp = 0;
int ans = 0;
if(a > b) {
temp = a;
a = b;
b = temp;
}
if(b > c) {
temp = c;
c = b;
b = temp;
if(a > b) {
temp = a;
a = b;
b = temp;
}
}
ans = Math.min(a, c - b);
a -= ans;
c -= ans;
if(a > 1) {
c -= a / 2;
b -= a / 2;
ans += a - a % 2;
}
ans += b;
return ans;
}
}
总结
理解题目的意思找出规律,容易犯的是直接进行数量上的加减。
以上是关于1753. 移除石子的最大得分的主要内容,如果未能解决你的问题,请参考以下文章