给定整数区域A,如何找到矩形的整数边w和h,使得w * h = A且w + h尽可能小?我宁愿算法简单而不是有效(尽管在合理的效率范围内)。
实现这一目标的最佳方法是什么?
找出A的主要因素,然后以某种方式将它们组合起来,试图平衡w和h?找到具有最接近A的区域的整数边的两个正方形然后以某种方式在它们之间进行插值?我没有想到的任何其他方法?
答案 0 :(得分:2)
你只需要找到:
两者的乘积总是A,因此这些因素是w
和h
当然,您只需搜索其中一个,因为一旦您w
,您只需设置h = A / w
答案 1 :(得分:1)
这是我头顶的一些东西,
从w=1; h=A;
然后迭代w
,增加它。每增加w
后,只要h
尝试减少w*h>A
。
此外,您还需要某种启发式函数来确定w / h组合的大小。我们称之为size(x,y)
。
在每一步中,您都必须检查size(w,h)<size(bestW,bestH)
是否bestW
和bestH
是您遇到的w
和h
的最佳值远。
就size(x,y)
的实施情况而言,您可以return x+y
或return Math.abs(x-y)
因为你只需要w
&gt; = w
并且最初h
一直在增加h=A
我猜我的复杂性就在某个地方。 O(A/2) <= true complexity <= O(2A)
现在有些伪代码:
w=1;
h=A;
bestW=w;
bestH=h;
while(2*w<=A){
w++;
while(w*h>A) {
h--;
}
if(w*h==A && size(w,h)<size(bestW,bestH)){
bestW=w;
bestH=h;
}
}