欢迎光临散文网 会员登陆 & 注册

【蓝桥杯学习记录】货物摆放

2022-04-04 17:31 作者:长舟泛歌  | 我要投稿

一、题目

小蓝有一个超大的仓库,可以摆放很多货物。

现在,小蓝有 nn 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。

小蓝希望所有的货物最终摆成一个大的长方体。即在长、宽、高的方向上分别堆 LWH 的货物,满足 n = L × W × H

请问,当 n = 2021041820210418时,(注意有 16 位数字)时,总共有多少种方案?

二、解题思路

本题思路很简单,可以用三重循环(循环变量依次为i,j,k),在第三重循环检测是否等于n,但是因为数太大,所以需要优化,否则的话会运行很长时间(看蓝桥杯解析讲最基本的暴力算法要运行一年才能得出结果,可怕)。

首先在三重循环中,可以在第二重循环中先判断i*j是否大于n,这样可以少运行一点时间。但是这样还不够。

我们发现对于能够符合i*j*k的数,一定是n的因数所以我们可以先算出这些因数并存储在一个数组a中,这样只需要一个循环,并且这个循环也可以优化,我们会发现对与n的因数x,n/x也是n的因数,所以在循环中可以先判断x是否是他的因数,然后n/x也是他的因数。当然还有种特殊情况就是x*x=n时,只需要将一个x加入数组就行,所以还需要判断一下x是否等于n/x。此时可以看出来,我们不需要再循环sqrt(n) (%5Csqrt%7Bn%7D%20)之后的数了,因为在前面的循环中我们已经计数过了。

最后只需要在数组a中进行三重循环,判断a[i]*a[j]*a[k]是否等于n就可以了,这样时间大大缩短了。

三、完整代码


【蓝桥杯学习记录】货物摆放的评论 (共 条)

分享到微博请遵守国家法律