主题:[NOIP热身竞赛]方砖问题(顶楼公布正解)
			 maxumi
				 [专家分:2200]  发布于 2007-07-22 16:42:00
 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
小田甜 [专家分:3910]  发布于 2007-08-13 03:59:00				
				交表……
							 
						
				22 楼
				
					 游侠UFO [专家分:1200]  发布于 2007-08-13 12:29:00
游侠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
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
cmy28 [专家分:380]  发布于 2007-08-14 15:39:00				
				游侠UFO得很有道理!!
shisutianxia的……他没有说每块砖大小相同,这样做不保证是最优解
							 
						
				25 楼
				
					 shisutianxia [专家分:630]  发布于 2007-08-14 17:28:00
shisutianxia [专家分:630]  发布于 2007-08-14 17:28:00				
				-------------------------------------
-------------------------------------
啊!!!!!!!!!
							 
						
				26 楼
				
					 风吻sky [专家分:0]  发布于 2007-08-16 09:29:00
风吻sky [专家分:0]  发布于 2007-08-16 09:29:00				
				
纠正一个错误.  N=3时,m=6
							 
						
				27 楼
				
					 shisutianxia [专家分:630]  发布于 2007-08-16 09:42:00
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
风吻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
maxumi [专家分:2200]  发布于 2007-08-18 08:28:00				
				
正解公布了
							 
						
				30 楼
				
					 游侠UFO [专家分:1200]  发布于 2007-08-18 10:33:00
游侠UFO [专家分:1200]  发布于 2007-08-18 10:33:00				
				好像就是我说的那个思路。。
							 
									
			
我来回复