背景
小杉终于进入了天堂。他看到每个人都带着一双隐形翅膀,他也想要。
(小杉是怎么看到的?……)
描述
天使告诉小杉,每只翅膀都有长度,两只翅膀的长度之比越接近黄金分割比例,就越完美。
现在天使给了小杉N只翅膀,小杉想挑出一对最完美的。
格式
输入格式
每组测试数据的
第一行有一个数N(2<=N<=30000)
第二行有N个不超过1e5的正整数,表示N只翅膀的长度。
20%的数据N<=100
输出格式
对每组测试数据输出两个整数,表示小杉挑选出来的一对翅膀。
注意,比较短的在前,如果有多对翅膀的完美程度一样,请输出最小的一对。
样例1
样例输入1
4
2 3 4 6
Copy
样例输出1
2
3
Copy
限制
每个测试点1s
提示
你可以认为黄金分割比就是0.6180339887498949
来源
lolanv
//哇,人生第一道离散化耶
const
gold:double=0.6180339887498949;//黄金比例,这个不能错
var
k,min:double;
x,y,n,i,j:longint;
a:array[0..100001] of double;
procedure kui(x,y:longint);//递增快排
var
i,j:longint;
m,t:double;
begin
i:=x;j:=y;
m:=a[(i+j)div 2];
repeat
while a[i]<m do inc(i);
while a[j]>m do dec(j);
if i<=j then begin
t:=a[i];
a[i]:=a[j];
a[j]:=t;
inc(i);
dec(j);
end;
until i>j;
if i<y then kui(i,y);
if x<j then kui(x,j);
end;
begin
read(n);
for i:=1 to n do read(a[i]);
kui(1,n);
i:=1;j:=2;min:=999999.9;
repeat//开始找吧!
k:=a[i]/a[j]-gold;
if abs(k)<min then begin
min:=abs(k);
x:=i;y:=j;
end;
//这里很重要,有些同学可能会想到正负数上的if,这就需要两个判断了,但是这里可以用一个abs,因为就算<0是负数,也可以把绝对值看做一个比例值,不用考率正负,但是为了保证a[x]<a[y]所以说下一个if k>0是必要的;
if k>0 then inc(j) else inc(i);
until j>n;
writeln((a[x]):0:0);
writeln((a[y]):0:0);//其实可以用长整型的
end.
3503

被折叠的 条评论
为什么被折叠?



