回 帖 发 新 帖 刷新版面

主题:请问谁知道雀巢原理?

帮忙看一下这个帖,谢谢!
[url=http://www.programfan.com/club/showbbs.asp?id=89252]http://www.programfan.com/club/showbbs.asp?id=89252[/url]

回复列表 (共4个回复)

沙发

帖子以阅,请给出数据规模(n最大的可能取值),让我们想想怎么编程序。

板凳

数据规模在题目中有啊!
输入
第一行是奶牛的个数n(1<=n<=5000);第2到第n+1行是每头奶牛的编号Si(1<=Si<=1000000)
输出
仅一行,是最少的床的数目。
讲讲思路也行啊

3 楼

书上提供的源程序如下:它说用雀巢原理做,看不懂
var
n,max:longint;
a:array[1..5000]of longint;
mo:array [0..1000000] of boolean;
procedure init;
var i:longint;
begin
  assign(input,'bed.in');reset(input);
  read(n);
  for i:=1 to n do read(a[i]);
  close(input);
end;
function prime(n:longint):boolean;
var i:longint;
begin
     i:=2;
     while (i*i<=n) and (n mod i<>0) do i:=i+1;
     if i*i>n then prime:=true else prime:=false
end;
procedure work;
var i,j,k,temp:longint;
begin
     fillchar(mo,sizeof(mo),false);
     max:=0;
     for i:=1 to n-1 do
         for j:=i+1 to n do
         begin
              temp:=abs(a[i]-a[j]);
              mo[temp]:=true;
              if temp>max then max:=temp
         end;
     i:=2;
     while prime(i) and (max div i>=n) do
     begin
          k:=i;
          while max div k>=n do
          begin
               for j:=n to max div k do
                   if mo[j*k] then mo[j]:=true;
               k:=k*i
          end;
          i:=i+1
     end
end;

procedure out;
var k:longint;
begin
  assign(output,'bed.out');rewrite(output);
  k:=n;
  while (k<=max) and mo[k] do k:=k+1;
  write(k);
  close(output);
end;
begin
  init;
  work;
  out;
end.

4 楼


我来回复

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