有这么一个大方块,是一个X x Y x Z的方块,由这么多个1 x 1 x 1的方块组成,你可以切k刀,问最多可以切成多少块。
我们知道平方差公式 (x+y)(x-y)=x*x-y*y ,即两个数的和一定,差越小他们俩的乘积越大。同理我们可以知道三个数字也是这样。
所以我们要尽可能的让长宽高被切的刀数尽可能相近。 可以的话最好三个都相同,无法被3整除的时候余数也应该尽可能的平分。
为了分隔的尽量最优,我们应该从边长最小的开始切,看是否满足k/3,不够的话切满剩下的分给另外两边,以此类推。
代码也比较简单易懂,看代码也会比较容易帮助理解一些
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll c[3];
int main()
{
ll x,y,z,k;
cin>>x>>y>>z>>k;
c[0]=x-1,c[1]=y-1,c[2]=z-1;
sort(c,c+3);
if(c[0]>=k/3) c[0]=k/3,c[1]=(k-c[0])/2,c[2]=min(c[2],k-c[0]-c[1]);
else
{
if(c[1]>=(k-c[0])/2) c[1]=(k-c[0])/2,c[2]=min(c[2],k-c[0]-c[1]);
else c[2]=min(c[2],k-c[1]-c[0]);
}
//cout<<(c[0]+1)<<" "<<(c[1]+1)<<" "<<(c[2]+1)<<endl;
cout<<(c[0]+1)*(c[1]+1)*(c[2]+1);
return 0;
}

本文介绍了一个游戏中的数学问题:玩家需要通过有限次切割将一个大型方块分割成尽可能多的小方块。文章提供了一种高效的算法解决方案,并附带了易于理解的代码实现。
1078

被折叠的 条评论
为什么被折叠?



