地址:
力扣https://leetcode-cn.com/problems/maximum-score-from-removing-stones/
题目:
你正在玩一个单人游戏,面前放置着大小分别为 a、b 和 c 的 三堆 石子。
每回合你都要从两个 不同的非空堆 中取出一颗石子,并在得分上加 1 分。当存在 两个或更多 的空堆时,游戏停止。
给你三个整数 a 、b 和 c ,返回可以得到的 最大分数 。
示例 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 分 。 |
示例 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 分 。 |
示例 3:
输入:a = 1, b = 8, c = 8 输出:8 解释:最优的一组操作是连续从第二和第三堆取 8 回合,直到将它们取空。 注意,由于第二和第三堆已经空了,游戏结束,不能继续从第一堆中取石子。 |
提示:
1 <= a, b, c <= 105 |
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-score-from-removing-stones
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
这是一道游戏题,简化来讲就是每次取 2 个,直到有两个堆取完,并且尽可能大多拿
考虑 a <= b <= c 的三个堆
1. a+b <= c 最后为空的一定是 a,b两个堆,所以总共拿了 a+b
2. a+b > c ,相当于在 1 的情况下,额外给了一些 a,b,那么问题即是消耗额外的a,b的次数先
然后在继续情况 1 的处理
方法一、排序
int cmp(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}
int maximumScore(int a, int b, int c){
int num = 0;
int *arr = (int *)malloc(sizeof(int) * 3);
arr[0] = a;
arr[1] = b;
arr[2] = c;
qsort(arr, 3, sizeof(int), cmp);
while( (arr[0] + arr[1]) > arr[2])
{
num++;
arr[0]--;
arr[1]--;
}
num += arr[0] + arr[1];
free(arr);
return num;
}