蓝桥杯每日一题----货物摆放

题目

分析

上来一看,三个for循环,从1到n,寻找满足lw h=n的个数,但是这样根本跑不出来答案,n太大了,1e15的级别,O(n)的时间复杂度都不行,更何况是O(n^3)。

尝试降低时间复杂度很难,可以尝试降低数据规模。

插入理论:影响代码运行时间的两个因素算法时间复杂度和数据规模。

我们可以观察一下,满足lwh=n的l,w和h有什么特点。他们肯定是n的因子,那么我们只需要遍历n的因子就可以了。怎么求n的因子呢?一个for循环遍历即可,时间复杂度是O(sqrt(n)),满足要求。

解题

第一步:

求n的因子的代码如下,

java 复制代码
long n = 2021041820210418l;
	Set<Long> set = new HashSet<Long>();
	for(long i = 1;i <= n / i;i++) {
		if(n%i==0) {
			set.add(i);
			set.add((n/i));
		}
	}

因为找到一个小于sqrt(n)的因子i,必然也能根据i找到大于sqrt(n)的另一个因子,即n/i。

第二步:

遍历n的因子

java 复制代码
long ans = 0;
	for(Long a:set)
		for(Long b:set)
			for(Long c:set)
				if(a*b*c==n) ans++;

第三步:

输出答案

java 复制代码
System.out.println(ans);	

完整代码:

java 复制代码
import java.util.HashSet;
import java.util.Set;

public class 货物摆放 {
public static void main(String[] args) {
	long n = 2021041820210418l;//2430
	Set<Long> set = new HashSet<Long>();
	for(long i = 1;i <= n / i;i++) {
		if(n%i==0) {
			set.add(i);
			set.add((n/i));
		}
	}
	long ans = 0;
	for(Long a:set)
		for(Long b:set)
			for(Long c:set)
				if(a*b*c==n) ans++;
	System.out.println(ans);	
}
}
相关推荐
kingmax542120089 小时前
图论核心算法(C++):包括存储结构、核心思路、速记口诀以及学习方法, 一站式上机考试学习【附PKU百练,相关练习题单】
c++·算法·图论·信奥赛·上机考试·百练·pku
罗湖老棍子9 小时前
【例9.15】潜水员(信息学奥赛一本通- P1271)
c++·算法·动态规划·二维费用背包
_OP_CHEN9 小时前
算法基础篇:(二十一)数据结构之单调栈:从原理到实战,玩转高效解题
数据结构·算法·蓝桥杯·单调栈·算法竞赛·acm/icpc
q***518911 小时前
【语义分割】12个主流算法架构介绍、数据集推荐、总结、挑战和未来发展
算法·架构
Ghost-Silver11 小时前
《星火》——关于Deepseek的进化速度
笔记·算法
代码游侠14 小时前
日历的各种C语言实现方法
c语言·开发语言·学习·算法
春日见18 小时前
丝滑快速拓展随机树 S-RRT(Smoothly RRT)算法核心原理与完整流程
人工智能·算法·机器学习·路径规划算法·s-rrt
Code小翊18 小时前
”回调“高级
算法·青少年编程
云里雾里!18 小时前
力扣 977. 有序数组的平方:双指针法的优雅解法
算法·leetcode·职场和发展
一只侯子21 小时前
Face AE Tuning
图像处理·笔记·学习·算法·计算机视觉