主题:[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个回复)
11 楼
abcwuhang [专家分:1840] 发布于 2007-07-31 13:05:00
回朔时间效率不高,很容易超时~~~~~~~~~~..............
12 楼
cmy28 [专家分:380] 发布于 2007-07-31 13:38:00
的确……动归怎么做?![em10][em10]
13 楼
abcwuhang [专家分:1840] 发布于 2007-07-31 15:18:00
.
14 楼
cmy28 [专家分:380] 发布于 2007-08-01 11:01:00
干吗呢你?!
说不出来了吧!!
15 楼
maxumi [专家分:2200] 发布于 2007-08-02 09:59:00
提示:对于一个长方形, 先从这个长方形中切下一个最大的正方形, 再对剩余部分重复这个操作
16 楼
cmy28 [专家分:380] 发布于 2007-08-02 18:55:00
恩…………是呀!这我也想到了,可正方形呢?
真的不知道,唉…………
17 楼
abcwuhang [专家分:1840] 发布于 2007-08-06 12:29:00
添补再切挖...
18 楼
abcwuhang [专家分:1840] 发布于 2007-08-08 11:59:00
不知是否这样:
program fangzhuan;
var n:integer;
procedure print(x:integer);
begin
writeln(x);
halt;
end;
procedure make;
var f,last:integer;
begin
f:=(n div 2)+1;
last:=n-f;
print(4+last*2);
end;
procedure check;
begin
if (n<2) or (n>10000) then
begin
writeln('Input data error.');
halt;
end;
if not(odd(n)) then print(4)
else make;
end;
begin
readln(n);
check;
end.
19 楼
abcwuhang [专家分:1840] 发布于 2007-08-08 22:10:00
对吗????????????????????
20 楼
abcwuhang [专家分:1840] 发布于 2007-08-12 18:51:00
如何?
我来回复