覆盖大小为 n x m 的矩形网格所需的最小正方形数
Minimum number of squares required to cover a rectangular grid of size n by m
问题陈述是找到最小的正方形数量其边是 2 的幂 需要覆盖一个大小为 n 乘以 m 的矩形网格。
我写了下面的代码:
ll solve(ll n,ll m)
{
if(n==0||m==0)
return 0;
else if(n%2==0&&m%2==0)
return solve(n/2,m/2);
else if(n%2==0&&m%2==1)
return (solve(n/ 2,m/ 2));
else if(n%2==1&&m%2==0)
return (solve(n/ 2,m/ 2));
else
return (n+m-1+solve(n/2,m/2));
}
建议我,因为它给出了错误的答案。
W.l.o.g。我们说 n>=m 并选择 m 的形式为 2^x。 (如果 m 是任意的 <= n 也仅意味着我们将相同的方法应用于大小为 n 倍 m-2^x 的第二个矩形,其中 x=int_floor(ld(m)) 和ld 当然是以 2 为底的日志。)
以下代码段应计算所需的方块数。
countSquares(m,n,x) :
if n == 0 : return 0
if n == 1 : return m
if n/2^x >= 1 :
return m/2^x + countSquares(m,n-2^x,x-1)
else
countSquares(m,n,x-1)
第三个中的return如果:m/2^x总是一个自然数,因为m的开头形式是2^x,任何2^(x-(x-i)) 仍然是自然数。
如果我们只对下限感兴趣。我会假设选择一个大小为 a 乘以 b 的矩形,其中 a:=2^x - 1 和 b:=2^y -1 应该导致大约 ld(a) 乘以 ld(b) 的方块数。
将代码片段扩展到任意 m 似乎涉及第二次递归:
partitionAndCount(n,m) :
if n < m : swap(n,m)
var x = floor(ld(m))
var mRes = m - 2^x
if mRes == 0 : return countSquares(2^x,n,x-1)
if mRes == 1 : n + return countSquares(2^x,n,x-1)
return partitionAndCount(n,mRes) + countSquares(2^x,n,x-1)
问题陈述是找到最小的正方形数量其边是 2 的幂 需要覆盖一个大小为 n 乘以 m 的矩形网格。
我写了下面的代码:
ll solve(ll n,ll m)
{
if(n==0||m==0)
return 0;
else if(n%2==0&&m%2==0)
return solve(n/2,m/2);
else if(n%2==0&&m%2==1)
return (solve(n/ 2,m/ 2));
else if(n%2==1&&m%2==0)
return (solve(n/ 2,m/ 2));
else
return (n+m-1+solve(n/2,m/2));
}
建议我,因为它给出了错误的答案。
W.l.o.g。我们说 n>=m 并选择 m 的形式为 2^x。 (如果 m 是任意的 <= n 也仅意味着我们将相同的方法应用于大小为 n 倍 m-2^x 的第二个矩形,其中 x=int_floor(ld(m)) 和ld 当然是以 2 为底的日志。)
以下代码段应计算所需的方块数。
countSquares(m,n,x) :
if n == 0 : return 0
if n == 1 : return m
if n/2^x >= 1 :
return m/2^x + countSquares(m,n-2^x,x-1)
else
countSquares(m,n,x-1)
第三个中的return如果:m/2^x总是一个自然数,因为m的开头形式是2^x,任何2^(x-(x-i)) 仍然是自然数。
如果我们只对下限感兴趣。我会假设选择一个大小为 a 乘以 b 的矩形,其中 a:=2^x - 1 和 b:=2^y -1 应该导致大约 ld(a) 乘以 ld(b) 的方块数。
将代码片段扩展到任意 m 似乎涉及第二次递归:
partitionAndCount(n,m) :
if n < m : swap(n,m)
var x = floor(ld(m))
var mRes = m - 2^x
if mRes == 0 : return countSquares(2^x,n,x-1)
if mRes == 1 : n + return countSquares(2^x,n,x-1)
return partitionAndCount(n,mRes) + countSquares(2^x,n,x-1)