首页 > 试题广场 >

切割块

[编程题]切割块
  • 热度指数:1399 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

有一个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)


输出描述:
输出仅包含一个正整数,即至多切割成多少块。
示例1

输入

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型。

编辑于 2020-04-22 23:40:26 回复(0)
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实现, 供参考。
发表于 2020-02-19 23:48:42 回复(0)