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

  • 相关阅读:
    软件开发 —— 重构(refactor)
    语言与哲学 —— 维特根斯坦
    【撸码caffe 三】 caffe.cpp
    编程语言入门及进阶、设计模式、面向对象书籍
    用ISA2006配置单网卡缓存服务器
    Forefront TMG 之 ISP 冗余传输链路(ISP-R)
    MDT配置数据库
    MDT概念说明
    更改SQL实例端口
    SCCM2012安装、配置
  • 原文地址:https://www.cnblogs.com/dreamtaker/p/15366397.html
Copyright © 2011-2022 走看看