有一个xyz的立方体,要在这个立方体上砍k刀,每一刀可以看作是用一个平行于立方体某一面的平面切割立方体,且必须在坐标为整数的位置切割,如在x=0.5处用平面切割是非法的。
问在切割k刀之后,最多可以把立方体切割成多少块。
输入描述:
输入仅包含一行,一行包含4个正整数x,y,z,k分别表示xyz的立方体和切割k刀。(1<=x,y,z<=106,0<=k<=109)
输出描述:
输出仅包含一个正整数,即至多切割成多少块。
输入例子1:
2 2 2 3
输出例子1:
8
#include <bits/stdc++.h>
using namespace std;
long long maxk(long long k) {
long long a = k / 3;
long long b = k % 3;
if (b == 0) {
return (a + 1) * (a + 1) * (a + 1);
} else if (b == 1) {
return (a + 1) * (a + 2) * (a + 1);
} else {
return (a + 1) * (a + 2) * (a + 2);
}
}
int main(){
long long x, y, z, k;
cin >> x >> y >> z >> k;
vector<long long> v(3);
v[0] = x;
v[1] = y;
v[2] = z;
sort(v.begin(), v.end());
long long res = 1;
x = v[0];
y = v[1];
z = v[2];
if (k >= (x + y + z - 3)) {
cout << x * y * z;
return 0;
}
if (k >= (x + 2 * y - 3)) {
cout << x * y * (k - y - x + 3);
return 0;
}
if (k >= 3 * (x - 1)){
cout << x * ((k - x + 2) / 2 + 1) * ((k - x + 1) / 2 + 1);
return 0;
}
res = maxk(k);
cout << res;
return 0;
}
//1 2 4 8 12 18 27
//1 2 2 2 3
//1 1 2 2 2
//1 1 1 2 2