主题:[NOIP热身竞赛]方砖问题(顶楼公布正解)
maxumi
[专家分:2200] 发布于 2007-07-22 16:42:00
有一块n*n的大方砖(2<=n<=10000), 现要将其分成m块小正方形砖, 求m的最小值.
输入(bricks.in):
本题有多组测试数据, 每组测试数据占1行, 每行为一个数n.
输出(bricks.out):
每组输出占1行, 每行为一个数m.
样例输入:
2
3
5
9999
样例输出:
4
6
8
6
正解:
program lx;
var
i, n, p, min:word;
function calc(m, n:word): word;
begin
if n=0 then
calc:=0
else
calc:=m div n + calc(n, m mod n);
end;
begin
while not seekeof do begin
readln(n);
min:=maxint;
if n=1 then p:=1;
for i:=1 to n div 2 do begin
p:=2+calc(n-i, i) shl 1;
if min>p then min:=p;
end;
writeln(min);
end;
end.
最后更新于:2007-08-18 08:23:00
回复列表 (共30个回复)
沙发
Matodied [专家分:7560] 发布于 2007-07-22 21:45:00
只要使m个完全平方数的和等于n*n,并且这些完全平方数尽可能大,但要注意超边长问题,其中不能有几个正方形的边长之和超过m。
板凳
angwuy [专家分:2280] 发布于 2007-07-23 09:56:00
m能不能是1?
3 楼
Matodied [专家分:7560] 发布于 2007-07-23 13:48:00
楼上的:
当然可以。
不过m也不是越大越好:比如n=6时:(每个方砖里的数十这个方砖的面积m)
— — — — — —
| |_1|
| |_1|
| 25 |_1|
| |_1|
|______________|_1|
|_1|_1|_1|_1|_1|_1|
就没有
— — — — — — — — — — — —
| | 4 | | | |
| 16 |_____| | 9 | 9 |
| | 4 | 和 |________|________|
|___________|_____| | | |
| 4 | 4 | 4 | | 9 | 9 |
|_____|_____|_____| |________|________|
用的方砖少。
4 楼
maxumi [专家分:2200] 发布于 2007-07-28 15:32:00
这个问题其实不是很复杂的......
5 楼
cmy28 [专家分:380] 发布于 2007-07-30 16:01:00
怎么做啊??还有,如果是长方形怎么办??
6 楼
abcwuhang [专家分:1840] 发布于 2007-07-30 22:21:00
当n=3时m应为6吧.
7 楼
abcwuhang [专家分:1840] 发布于 2007-07-30 22:22:00
貌似动归可以..
8 楼
maxumi [专家分:2200] 发布于 2007-07-31 09:27:00
[quote]貌似动归可以..[/quote]
不需要用动态规划......
9 楼
abcwuhang [专家分:1840] 发布于 2007-07-31 12:32:00
真的吗??????????
我现在只想到用动规的方法..............~~~真晕~~~~~~~~~~~```
10 楼
cmy28 [专家分:380] 发布于 2007-07-31 13:03:00
…………表刺激我!!
动归怎么做呀??我只想到回溯。。
我来回复