回 帖 发 新 帖 刷新版面

主题:[NOIP热身竞赛]方砖问题(顶楼公布正解)

有一块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.

回复列表 (共30个回复)

21 楼

交表……

22 楼

我来抛块砖

有点像几何问题。。。我觉得搜索就能搞定

先考虑平均分成4块的情况,如果分割出的砖边长不为整数,就扩大左上角的砖(边长设为a)的面积,直到剩余部分能够分割X(X为整数)块边长为n-a的砖为止。最后M=X+1。

没写程序验证。


PS:顺便给大家个建议,以后帖代码之前最好先帖出自己的算法描述(流程图、自然语言等),这样可以极大的方便读者理解你的代码,而且写算法描述也能使自己思路清晰。

23 楼

我想问题可以这么做
N*N=N的最大因子的平方乘以M
M:=.........
在我的BLOG里有源程序,http://hi.baidu.com/649786031/blog

24 楼

游侠UFO得很有道理!!

shisutianxia的……他没有说每块砖大小相同,这样做不保证是最优解

25 楼

-------------------------------------
-------------------------------------
啊!!!!!!!!!

26 楼


纠正一个错误.  N=3时,m=6

27 楼

我找了一下,有人给出如下算法
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 楼



这里有没什么规律.N=2.M=4,N=3.M=6,N=5,M=9.....
 我找了好久,看能不能表达出来,哎,好象没规律.[em18][em18][em18][em18]

29 楼


正解公布了

30 楼

好像就是我说的那个思路。。

我来回复

您尚未登录,请登录后再回复。点此登录或注册