主题:[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个回复)
21 楼
小田甜 [专家分:3910] 发布于 2007-08-13 03:59:00
交表……
22 楼
游侠UFO [专家分:1200] 发布于 2007-08-13 12:29:00
我来抛块砖
有点像几何问题。。。我觉得搜索就能搞定
先考虑平均分成4块的情况,如果分割出的砖边长不为整数,就扩大左上角的砖(边长设为a)的面积,直到剩余部分能够分割X(X为整数)块边长为n-a的砖为止。最后M=X+1。
没写程序验证。
PS:顺便给大家个建议,以后帖代码之前最好先帖出自己的算法描述(流程图、自然语言等),这样可以极大的方便读者理解你的代码,而且写算法描述也能使自己思路清晰。
23 楼
shisutianxia [专家分:630] 发布于 2007-08-14 09:58:00
我想问题可以这么做
N*N=N的最大因子的平方乘以M
M:=.........
在我的BLOG里有源程序,http://hi.baidu.com/649786031/blog
24 楼
cmy28 [专家分:380] 发布于 2007-08-14 15:39:00
游侠UFO得很有道理!!
shisutianxia的……他没有说每块砖大小相同,这样做不保证是最优解
25 楼
shisutianxia [专家分:630] 发布于 2007-08-14 17:28:00
-------------------------------------
-------------------------------------
啊!!!!!!!!!
26 楼
风吻sky [专家分:0] 发布于 2007-08-16 09:29:00
纠正一个错误. N=3时,m=6
27 楼
shisutianxia [专家分:630] 发布于 2007-08-16 09:42:00
我找了一下,有人给出如下算法
program quadrel;
{$APPTYPE CONSOLE} { 如果用turbo pascal的话将这行去掉 }
const
MAX_N = 100; { 这是n的允许最大值 }
var
f: array [ 1..MAX_N, 1..MAX_N ] of integer; { 用来存储f(x,y)的值 }
n: integer;
function min(a,b:integer): integer; { 取两个数的较小值 }
begin
if (a < b)
then min := a
else min := b;
end;
function CalF(x, y: integer) : integer; { 利用公式3计算f(x,y) }
var
k,res:integer;
begin
if ( ( x = y )and( x < n ) )
then res := 1
else
begin
res := maxint;
for k:=(x div 2) to x-1 do
begin
res := min( res, f[k,y]+f[x-k,y]);
end;
end;
CalF := res;
end;
procedure work;
var
x,y:integer;
begin
for x:=1 to n do { 循环地计算f(x,y) }
for y:=1 to x do
begin
f[x,y] := CalF(x,y);
f[y,x] := f[x,y];
end;
end;
begin
for n:=2 to MAX_N do { 从n=2计算到n=MAX_N }
begin
work;
writeln(n:5,f[n,n]:5);
end;
readln;
end.
在百度搜索的,看起来有一点道理,不过还是可优化,对N*N正方形求解可以转化对边长为N的最小因子的正方形求解,你们认为呢????????
28 楼
风吻sky [专家分:0] 发布于 2007-08-16 09:45:00
这里有没什么规律.N=2.M=4,N=3.M=6,N=5,M=9.....
我找了好久,看能不能表达出来,哎,好象没规律.[em18][em18][em18][em18]
29 楼
maxumi [专家分:2200] 发布于 2007-08-18 08:28:00
正解公布了
30 楼
游侠UFO [专家分:1200] 发布于 2007-08-18 10:33:00
好像就是我说的那个思路。。
我来回复