我们得到一个 M x N 矩形,并要求用长度 2 ^ K,2 ^(K - 1),...,4的边长方形填充它2,1 。我们首先填充 2 ^ K (尽可能多),然后使用 2 ^(K - 1),依此类推。我们总共需要多少个方格?
我写了以下递归代码:
#include <stdio.h>
#include <stdlib.h>
long long_pow(long base, long exponent)
{
if (!exponent)
return 1L;
return base * long_pow(base, exponent - 1L);
}
long cover(long width, long height, long side)
{
if (width <= 0L || height <= 0L)
return 0L;
long full_width = width / side; // The full width we can cover.
long full_height = height / side; // The full height we can cover.
return (full_width * full_height) // The full area we can cover
// plus the rest (recursively).
+ cover(width - full_width * side, height, side / 2L)
+ cover(full_width * side, height - full_height * side, side / 2L);
}
int main()
{
long width, height, k;
scanf("%ld %ld %ld", &width, &height, &k);
printf("%ld\n", cover(width, height, long_pow(2L, k)));
return 0;
}
此代码在我给出的10个测试用例中的1个上失败。即,在123456789 987654321 4
上,它会输出1690311532
而不是476300678536044
。但是,在123456789 987654321 30
上,它会输出1437797319
的正确结果。其他测试用例也很有效。
问题出在哪里?
答案 0 :(得分:1)
代码的唯一问题是long
溢出。我改为使用unit64_t
。