7216:Minecraft ③

本文探讨了在Minecraft游戏中,使用N个立方体搭建长方体并用贴纸装饰的问题。通过两种不同的循环策略来寻找使表面积最小的长方体搭建方式,从而确定所需的最少贴纸数量。

描述

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值