有一个x*y*z的立方体,要在这个立方体上砍k刀,每一刀可以看作是用一个平行于立方体某一面的平面切割立方体,且必须在坐标为整数的位置切割,如在x=0.5处用平面切割是非法的。
问在切割k刀之后,最多可以把立方体切割成多少块。
有一个x*y*z的立方体,要在这个立方体上砍k刀,每一刀可以看作是用一个平行于立方体某一面的平面切割立方体,且必须在坐标为整数的位置切割,如在x=0.5处用平面切割是非法的。
问在切割k刀之后,最多可以把立方体切割成多少块。
输入仅包含一行,一行包含4个正整数x,y,z,k分别表示x*y*z的立方体和切割k刀。(1<=x,y,z<=10^6,0<=k<=10^9)
输出仅包含一个正整数,即至多切割成多少块。
2 2 2 3
8
代码
package org.nina.learn.aqy;
import java.util.Scanner;
/**
* @Author: zgc
* @Description: 切割块
* @Date: 2020/4/17 0:17
* @Version: 1.0
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String in = sc.nextLine();
String[] inputs = in.split(" ");
long x = Integer.valueOf(inputs[0]);
long y = Integer.valueOf(inputs[1]);
long z = Integer.valueOf(inputs[2]);
long k = Integer.valueOf(inputs[3]);
Main main = new Main();
System.out.println(main.split(x, y, z, k));
}
public long split(long x, long y, long z, long k) {
if (k == 0) {
return 1;
}
long a = 1, b = 1, c = 1;
while (k > 0 && a + b + c < x + y + z) {
if (a < x && k > 0) {
a ++;
k --;
}
if (b < y && k > 0) {
b ++;
k --;
}
if (c < z && k > 0) {
c ++;
k --;
}
}
return a * b * c;
}
}
首先,三个轴,每个轴在不切的情况下都是1等分。这里假设a对应x轴的等分数,那么不切的情况下a=1,以后每切1刀x轴对应的等分数为a = a + 1。同理假设b对应y轴,那么每切1刀y轴对应的等分数为b = b + 1。同理假设c对应z轴,那么每切1刀z轴对应的等分数为c = c + 1。
其次,不管是x轴、y轴还是z轴,每切1刀,刀数都会减1,为了得到最大的块数,必须连续的3刀切割在不同的轴上。
这里应该使用long类型,而不应该使用int类型。long类型的最大值为2^64-1=9223372036854775807。int类型的最大值为2^32-1=2147483647。而 1<=x,y,z<=10^6,0<=k<=10^9。如果用int类型,得到的结果可能超出int类型的最大值,高出32位的数会被截掉,只留下剩下的32位的int值,这样就会出错。因此一定要用long型。
import java.util.Arrays;
import java.util.Scanner;
public class Main{
private long a = 1;
private long b = 1;
private long c = 1;
// 排序解决方案:
public long func(int x,int y ,int z, int k){
int arry[] = {x,y,z};
Arrays.sort(arry);
//System.out.println(arry);
int size =k +1;
int i;
for(i = 0;i < k;){
if(a < arry[0] && a == b) {
a++;
i++;
}
else if(c < arry[1] && c == b) {
c++;
i++;
}
else if(b < arry[2]) {
b++;
i++;
}
else break;
}
return a * b * c;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Main main = new Main();
while (in.hasNextInt()) {//注意while处理多个case int a = in.nextInt();
int x = in.nextInt();
int y = in.nextInt();
int z = in.nextInt();
int k = in.nextInt();
System.out.println(main.func(x,y,z,k));
}
}
} java实现, 供参考。