四种元素平衡,一般解法。
【题目】《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向上取整
}
}
}