【C++】每日一题 :Minecraft

题目描述:

题目来源:链科学 (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;
}
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值