回 帖 发 新 帖 刷新版面

主题:[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个回复)

11 楼

回朔时间效率不高,很容易超时~~~~~~~~~~..............

12 楼


的确……动归怎么做?![em10][em10]

13 楼

.

14 楼


干吗呢你?!

说不出来了吧!!

15 楼

提示:对于一个长方形, 先从这个长方形中切下一个最大的正方形, 再对剩余部分重复这个操作

16 楼


恩…………是呀!这我也想到了,可正方形呢?
真的不知道,唉…………

17 楼

添补再切挖...

18 楼

不知是否这样:
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 楼

对吗????????????????????

20 楼

如何?

我来回复

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