2020-09-16

四种元素平衡,一般解法。

【题目】《XX魔法书》中记载,只有魔法师体内地火水风四种元素平衡的时候才是绝对安全的。某魔法师在给自己做了一个体检,
发现自己体内的四种元素数量分别是A,B,C,D,魔法师慌了,这时他看到魔法书中记载了一种转换魔法,
可以把任意两个单位的元素转换成任意一种元素。

首先要明确的是,除了ABCD元素有小于1的情况,其他情况都不会输出-1,因为是任意两个元素换成任意一个元素,那么可以任意两个A换成一个A,也就是可以自减1。所以最差的情况也是可以变成4个1。
那么从sum=A+B+C+D,平均值为avl=sum/4开始。最好的情况就是4个都为avl,然后我分别计算4个元素和avl的差值,比avl小的,用L来累加,比AVL大的用R来累加。

这个什么意思呢,就是说我要先把4中元素全部平衡成AVL,需要增多L个元素,减少R个元素,但是因为两个元素换成一个元素,所以要增多L个元素,需要2L个元素来换。 那么就可以判断,2L和R的大小。X=2L-R,如果X<=0,说明多余的R足够置换成L,那么直接打印avl*4. 如果X>0,说明R不足够置换成L,那么最后4个元素的平均值必定要小于avl,那么这个avl怎么算呢。我先把4个元素凑成4个avl,还少了X个,我就考虑4个avl再减去X个元素,那么这时候的平均值是多少呢,是avl-Math.ceil((double)x/4),然后再乘以4就是结果。注意类型转换,最后还要转换为long,因为向上取整返回的是double型。

举个例子,ABCD四个元素是1,10,12,14,sum=37,avl=9。那么要把ABCD都变成9,A需要加8个,BCD分别减1,3,5个,那么L=8,R=1+3+5=9。X=2L-R=16-9=7。也就是说还要补7个元素,最后才能变成4个9,那么我这时候再用4个9减去7,先每种元素减1个,就是4个8,这就减去了4个了,还剩3个,减去三个就是1个8,3个7,那么这个8肯定也要变成7,所以最大就是74=28。这也就是用9-ceil(7/4)=7。可以自己试着验算一下对不对,4个8就不行了,最多是4个7。



public class EleBalance {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()){
            long[] eles = new long[4];
            int sum = 0;
            for (int i = 0; i < 4; i++) {
                eles[i] = in.nextLong();
                sum += eles[i];
            }
            long avl = sum/4;
            long l = 0,r = 0;   //l累加比avl小的,r累加比avl大的
            for (int i = 0; i < 4; i++) {
                long sub = eles[i]-avl;
                if(sub<0)
                    l -= sub;   //由于sub小于0,所以用-=
                else if(sub>0)
                    r += sub;
            }
            long x = 2*l-r;     //比较用R去比L,够不够
            if (x<=0)
                System.out.println(avl*4);  //小于等于0说明是够的
            else
                System.out.println((long)(avl-Math.ceil(((double)x)/4))*4);     //大于0说明不够,那么输出avl-差值除以4向上取整
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值