描述
Minecraft是一个几乎无所不能的沙盒游戏,玩家可以利用游戏内的各种资源进行创造,搭建自己的世界。
在Minecraft中,基本的建筑元素是边长为1个单位的立方体,Tony想用N个这种小立方体搭建一个长方体,并用他珍藏已久的贴纸对其进行装饰。如果一张贴纸可以贴满小立方体的一个面。那么,他需要用掉多少张贴纸呢?
输入
一个整数N,表示小明所拥有的小立方体的个数。N不会超过1000。输出
一个整数,即小明最少用掉的贴纸有多少张。
思路:
给出n个边长为1的立方体,组合成一个长方体,如何组合才能使长方体的表面积最小?设a、b、c代表长方体的长、宽、高,则 s=(a*b+a*c+b*c)*2。由此,对a,b,c直接进行枚举,为避免重复,我们可以使用“由小枚举到大的策略”,即每次枚举都使a<=b<=c,那么a,b<=n/3;
1、三重循环,暴力枚举,简单易懂
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,s,minn;cin>>n;
minn=1000000;
for(int i=1;i<=n/3;i++)
for(int j=1;j<=n/3;j++)
for(int k=1;k<=n;k++)
if(i*j*k==n){
s=(i*j+i*k+j*k)*2;
if(s<minn)minn=s;
}
printf("%d",minn);
return 0;
}
2、二重循环也可以解决,速度快很多
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,h,s,minn=1000000;
cin>>n;
for(int i=1;i<=n/3;i++)
for(int j=1;j<=n/3;j++)
if(n%(i*j)==0){
h=n/(i*j);
s=(i*j+i*h+j*h)*2;
if(s<minn)minn=s;
}
printf("%d",minn);
return 0;
}