思路和做法
这个过程并没有那么简单,感觉好绕啊
A、B、C、D,四个瓶子,如果某个比如A瓶子没珍珠了,我们还能再往A中集中,(若其他可以减少),这样一来,我们又可以往别的瓶子中集中珍珠了!!!
只向一个瓶子进行增加珍珠,集中珍珠的操作(是不正确的)
long ans = Long.MIN_VALUE;
for(int i = 0; i < 4; i ++)
{
long m1 = Long.MAX_VALUE;
for(int j = 0; j < 4; j ++) {
if(i != j) m1 = Math.min(m1, a[j]);
}
ans = Math.max(ans, a[i] + 2 * m1);
}
A、B、C、D,四个瓶子,尽可能集中到D,A是最小的,那么A很快就没了,然后我们如果可以的话,要向A集中珍珠,A += 2,然后这个时候,在B、C允许的话(A还是最小的),可以向D再集中两次,也就是增加4次,但是由于向A中还集中了1次,向A集中一次,相当于D中增加了3个珍珠。
CODE
package 第二章基础算法_1;
import java.util.*;
public class 四个瓷瓶的神秘游戏 {
static long [] a = new long [4];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n ;
for(int i = 0; i < 4; i ++){
a[i] = sc.nextLong();
}
long ans = Long.MIN_VALUE;
//这是考虑集中在两个瓶子中
for(int i = 0; i < 4; i ++){
for(int j = 0; j < 4; j ++) {
if(i != j) {
long m1 = Long.MAX_VALUE;
for(int k = 0; k < 4; k ++) //剩下两个瓶子中次小的
{
if(k != i && k != j) m1 = Math.min(m1, a[k]);
}
long m2 = Math.min(m1, a[j]);
long x = a[i] + 2 * m2; //第一阶段
//m2是三个瓶子中最小的那个
//第二阶段操作的前提是最小的瓶子等于0,次小的不为0
//m1 = min(a[k1], a[k2]) 剩余两个瓶子最小的
//m2 = min(a[j], m1) 除了要集中的瓶子以外三个瓶子中最小的
//如果m2 < m1 //说明a[j]是最小的
//那么也就是说直接满足执行第二阶段的条件
//如果m2 <= m1
//可能a[j]本来就和m1相等,那么这个时候有两个0,不能执行第二阶段的擦欧总
//等于号也可以加上,后面都是0,也没用
//开始执行第二步操作
if(m1 >= m2) {
m1 -= m2; //因为a[j]向D瓶子中集中了m2次
//第二阶段增加的数量
x += m1 / 3 * 3;
if(m1 % 3 == 2){
x ++;
}
ans = Math.max(ans, x);
}
}
}
}
System.out.println(ans);
}
}