有一个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;
}