@
移除石头得到最大得分Maximum Score From Removing Stones
有3堆石子,大小分别为a
,b
,c
规则是每次只能从非空的2堆中各选一个,然后加1分。直到出现两个或者更多的空堆时,停止。
从给定的a
,b
,c
,计算能得到的最大分数。
思路
3堆大小分别为min,mid,max, 为了得到最大的分数,需要一个方法,尽可能的利用最小的一堆,将较多的2堆消耗为一样的数量。这样最后min可能消耗完毕或者只留一个,mid必然被消耗完毕。
第一步
尝试将max减到和mid一样多,利用min中的数量来消耗max,结果可能是
- max减到和mid一样多,并且min消耗完了。
- max 减到和mid一样多,但是min还有剩,
- max无法减到和mid一样多,因为min不够,此时min=0。
第二步,在上一步的基础上,其实只有2个方向,1,3和2。从1,3来考虑min消耗完了,那么只能从max,mid里面得分,觉得最后得分的是最小的一堆。从2 来考虑,min还有剩,那么接下来要做的,就是用mid和max分别减掉min的一半,但是min可能是奇数,所以要提前偶化处理,此时消耗完min,得分min,然后就是继续从mid和max得分
public int maximumScore(int a, int b, int c){
int min = Math.min(a,Math.min(b,c));
int max =Math.max(a,Math.max(b,c));
int mid =a+b+c-min-max;
int n=0;
//step1
int tmp = Math.min(max-mid,min);
max -= tmp;
min -= tmp;
n+=tmp;
//step2
if(min>0){
if(min%2==1){
min-=1;
}
max-=min/2;
mid-=min/2;
n+= min;
}
//step3
n+=mid;
return n;
}
Tag
math