zoukankan      html  css  js  c++  java
  • 【数据结构】移除石头得到最大得分Maximum Score From Removing Stones

    @

    移除石头得到最大得分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,结果可能是

    1. max减到和mid一样多,并且min消耗完了。
    2. max 减到和mid一样多,但是min还有剩,
    3. 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

  • 相关阅读:
    tensorflow中协调器 tf.train.Coordinator 和入队线程启动器 tf.train.start_queue_runners
    C++ 第八天
    C++ 第七天
    C++ 第四天
    c++ 编译报错汇总(随时更新)
    C++ 第二天
    C++ 第三天
    c++ 继承(二)
    c++ 继承(一)
    回调函数
  • 原文地址:https://www.cnblogs.com/dreamtaker/p/15366397.html
Copyright © 2011-2022 走看看