题目描述:
题目来源:链科学 (liankexue.cn)
Minecraft
Minecraft是一个几乎无所不能的沙盒游戏,玩家可以利用游戏内的各种资源进行创造,搭建自己的世界。
在Minecraft中,基本的建筑元素是边长为1个单位的立方体,Tony想用N个这种小立方体搭建一个长方体,并用他珍藏已久的贴纸对其进行装饰。如果一张贴纸可以贴满小立方体的一个面。那么,他需要用掉多少张贴纸呢?
时间限制:1000
内存限制:65536
输入
一个整数N,表示小明所拥有的小立方体的个数。N不会超过1000。
输出
一个整数,即小明最少用掉的贴纸有多少张。
样例输入
9
样例输出
30
思路分析:
读了题目,首先想到的是 这道题目涉及到了三维空间,也就是说数据中含有长 宽 高
为了保证用最少的贴纸,我们的最终的图形必须是一个规则的长方形。
也就是说我们需要循环遍历长,宽和高。为了不会无效枚举,减少时间复杂度,我们可以判断是否是一个长方形。如果n(方块数)模(%)以枚举的当前底面积(长乘宽)为0的话说明是一个长方形,我们就判断这个长方形是不是表面积最小的,如果是,则更新结果值为当前结果值,最后输出最终结果值就可以了
代码书写
框架+定义+基本输入
不必多说
#include <iostream>
using namespace std;
int main() {
int n, min = -1;//初始为任何负数(因为长度不会为负数)
cin >> n;
return 0;
}
循环i j遍历长 宽
利用for循环遍历长和宽
注意:长和宽的范围是从1到n(1*n),也就是从下往上累。
#include <iostream>
using namespace std;
int main() {
int n, min = -1;//初始为任何负数(因为长度不会为负数)
cin >> n;
for (int c = 1; c <= n; c++) {//遍历长
for (int k = 1; k <= n; k++) {//遍历宽
}
判断【高是否是整数】得到高,并计算表面积,判断是否需要更新最小值
#include <iostream>
using namespace std;
int main() {
int n, min = -1;//初始为任何负数(因为长度不会为负数)
cin >> n;
for (int c = 1; c <= n; c++) {//遍历长
for (int k = 1; k <= n; k++) {//遍历宽
if (n % (c * k) == 0) {//高一定是正数整数
int g = n / (c * k);//遍历高
if (min == -1 || min > 2*((c * k) + (k * g) + (c * g))) {//判断条件是否更改值
min = 2*((c * k) + (k * g) + (c * g));//更新表面积
}
}
}
}
cout << min;
}
写完了这些,还要考虑一个问题【如果底面积比总数还多】肯定不合理,要判断
#include <iostream>
using namespace std;
int main() {
int n, min = -1;//初始为任何负数(因为长度不会为负数)
cin >> n;
for (int c = 1; c <= n; c++) {//遍历长
for (int k = 1; k <= n; k++) {//遍历宽
if (n % (c * k) == 0) {//高一定是正数整数
int g = n / (c * k);//遍历高
if (min == -1 || min > 2*((c * k) + (k * g) + (c * g))) {//判断条件是否更改值
min = 2*((c * k) + (k * g) + (c * g));//更新表面积
}
}
if (c * k > n)//如果底面积大于总面积则肯定结束循环
break;
}
}
cout << min;
}
完整代码:
#include <iostream>
using namespace std;
int main() {
int n, min = -1;//初始为任何负数(因为长度不会为负数)
cin >> n;
for (int c = 1; c <= n; c++) {//遍历长
for (int k = 1; k <= n; k++) {//遍历宽
if (n % (c * k) == 0) {//高一定是正数整数
int g = n / (c * k);//遍历高
if (min == -1 || min > 2*((c * k) + (k * g) + (c * g))) {//判断条件是否更改值
min = 2*((c * k) + (k * g) + (c * g));//更新表面积
}
}
if (c * k > n)//如果底面积大于总面积则肯定结束循环
break;
}
}
cout << min;
}