有一个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
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实现, 供参考。
                                                                                    #include<iostream>
(720)#include<algorithm>
using namespace std;
void solve1030() {
    int x, y, z;
    while (cin >> x >> y >> z) {
        int times; cin >> times;
        long long  x_cnt=1, y_cnt =1, z_cnt =1; //int 会溢出
        long f = 0;
        while (times-- > 0) {
            if (x == 1 && y == 1 && z == 1) break;
            if (x > 1 && f == 0) { x -= 1; x_cnt += 1; }
            else if (y > 1 && f == 1) { y -= 1; y_cnt += 1;}
            else if (z > 1 && f == 2) { z -= 1; z_cnt += 1;}    
            else {
                times++;
            }
            f += 1; f %= 3; // 轮询切菜
        }
        cout << x_cnt * y_cnt * z_cnt << endl;
    }
}
int main(){
    solve1030();
    return 0;
}
                                                                                    import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        long[] len=new long[3];
        len[0]=sc.nextLong();
        len[1]=sc.nextLong();
        len[2]=sc.nextLong();
        long k=sc.nextLong();
        Arrays.sort(len);
        long temp=k/3;
        long c0=Math.min(len[0]-1,temp);
        k=k-c0;
        temp=k/2;
        long c1=Math.min(len[1]-1,temp);
        k=k-c1;
        long c2=Math.min(len[2]-1,k);
        System.out.println((c0+1)*(c1+1)*(c2+1));
    }
} x,y,z,k = list(map(int,input().split())) class solution: def __init__(self,x,y,z): f = [x,y,z] f.sort() self.x,self.y,self.z = f def fun(self,k): xx = k // 3 + 1 yy = k // 3 + 1 zz = k // 3 + 1 NN = k%3 shengxia = NN if xx > self.x: shengxia += xx - self.x xx = self.x if yy > self.y: shengxia += yy - self.y yy = self.y elif shengxia != 0 and yy+shengxia//2 < self.y: yy += shengxia //2 shengxia = shengxia - shengxia //2 elif shengxia != 0: shengxia = shengxia - (self.y - yy) yy = self.y if zz > self.z: zz = self.z if shengxia != 0: zz += shengxia if zz>self.z: zz = self.z return xx*zz*yy fun = solution(x,y,z) print(fun.fun(k))
#include<cstdio>
(802)#include<cstring>
#include<iostream>
(720)#include<algorithm>
using namespace std;
int main()
{
    int a[5],k;
    long long int maxd,maxk,m=104909296875;
    scanf("%d%d%d%d",&a[1],&a[2],&a[3],&k);
     //刀数
    maxd=(long long int)(a[1]-1)+(a[2]-1)+(a[3]-1);
     //快数
    maxk=(long long int)a[1]*a[2]*a[3];
    //k超过刀数
    if(k>=maxd)
    {
        printf("%lld\n",maxk);
        return 0;
    }
    else while(maxd!=k)
    {
        //找最长的那条边
        sort(a+1,a+4);
        //最长边减1
        a[3]--;
        //新的刀数和快数
        maxd=(long long int)(a[1]-1)+(a[2]-1)+(a[3]-1);
        maxk=(long long int)a[1]*a[2]*a[3];
    }
    printf("%lld",maxk);
    return 0;
} #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int a[5],k;
    long long int maxd,maxk,m=104909296875;
    scanf("%d%d%d%d",&a[1],&a[2],&a[3],&k);
     //刀数
    maxd=(long long int)(a[1]-1)+(a[2]-1)+(a[3]-1);
     //快数
    maxk=(long long int)a[1]*a[2]*a[3];
    //k超过刀数
    if(k>=maxd)
    {
        printf("%lld\n",maxk);
        return 0;
    }
    else while(maxd!=k)
    {
        //找最长的那条边
        sort(a+1,a+4);
        //最长边减1
        a[3]--;
        //新的刀数和快数
        maxd=(long long int)(a[1]-1)+(a[2]-1)+(a[3]-1);
        maxk=(long long int)a[1]*a[2]*a[3];
    }
    printf("%lld",maxk);
    return 0;
} var a = readline().split(' ')
var x = parseInt(a[0])
var y = parseInt(a[1])
var z = parseInt(a[2])
var k = parseInt(a[3])
main(x,y,z,k)
function main(x,y,z,k){
    var a = [x,y,z]
     
    var max
    var max_kuai =a[0]*a[1]*a[2]
    var max_dao = a[0]+a[1]+a[2]-3
    if(k>=max_dao){
        max = max_kuai
    }else{
        while(max_dao !== k){
            a.sort(sortnumber)
            a[2]--
            max_dao = a[0]+a[1]+a[2]-3
            max_kuai = a[0]*a[1]*a[2]
        }
        max = max_kuai
    }
    return console.log(max)
}
function sortnumber(a,b){
    return a-b
} x, y, z, k = [int(x) for x in input().split(' ')]
x, y, z = sorted([x-1, y-1, z-1])
if x*3 >= k:
    x = y = int(k/3)
    z = k - x - y
else:
    y = min(int((k - x)/2), y)
    z = min((k - x - y), z)
max_chunks = (x+1)*(y+1)*(z+1)
print(max_chunks)
 理想情况肯定是均匀切k/3刀, 代码
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.*;
public class Main {
	public static void main(String[] args) {
		int nums[] = new int[3];
		int res[] = new int[3];
		long ans = 1;
		Scanner input = new Scanner(System.in);
		for (int i = 0; i < nums.length; i++) {
			nums[i] = input.nextInt();
		}
		Arrays.sort(nums);
		int k = input.nextInt();
		for (int i = 0; i < 3; i++) {
			int cut = k / (3 - i);
			if (cut > nums[i] - 1) {
				res[i] = nums[i];
			} else {
				res[i] = cut + 1;
			}
			k = k - (res[i] - 1);
			ans = ans * res[i];
		}
		
		System.out.println(ans);
	}
} #include<iostream>
using namespace std;
int main()
{
    long long int x;
    long long int y;
    long long int z;
    long long int k;
    cin>>x>>y>>z>>k;
    long long int x_=0;
    long long int y_=0;
    long long int z_=0;
    long long int m = min(k,(x+y+z-3));
    for(int i =1 ;i<=m;i++)
    {
        if (x_==x-1)
            x_=1e10;
        if (y_==y-1)
            y_=1e10;
        if (z_==z-1)
            z_=1e10;
        long long int* p = &x_;
        if (*p>=y_)
            p=&y_;
        if(*p>=z_)
            p=&z_;
        *p=*p+1;
    }
    if(x_==1e10)
        x_=x-1;
    if(y_==1e10)
        y_=y-1;
    if(z_==1e10)
        z_=z-1;
    cout<<(x_+1)*(y_+1)*(z_+1)<<endl;
         
     
}