主题:请问谁知道雀巢原理?
wxljqi
[专家分:0] 发布于 2005-07-07 20:17:00
帮忙看一下这个帖,谢谢!
[url=http://www.programfan.com/club/showbbs.asp?id=89252]http://www.programfan.com/club/showbbs.asp?id=89252[/url]
回复列表 (共4个回复)
沙发
eastcowboy [专家分:25370] 发布于 2005-07-10 15:30:00
帖子以阅,请给出数据规模(n最大的可能取值),让我们想想怎么编程序。
板凳
wxljqi [专家分:0] 发布于 2005-07-11 12:25:00
数据规模在题目中有啊!
输入
第一行是奶牛的个数n(1<=n<=5000);第2到第n+1行是每头奶牛的编号Si(1<=Si<=1000000)
输出
仅一行,是最少的床的数目。
讲讲思路也行啊
3 楼
wxljqi [专家分:0] 发布于 2005-07-11 12:27:00
书上提供的源程序如下:它说用雀巢原理做,看不懂
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 楼
wxljqi [专家分:0] 发布于 2005-07-15 07:56:00
顶
我来回复