讨论 / 有O(N)算法的牛吗??
pascal 2010-05-07 01:55:00
点我顶贴 收藏 删除
有O(N)算法的牛吗??
#1 wish@2008-11-08 18:25:00
回复 删除
双队列
#2 青龙白狐@2008-11-08 18:25:00
回复 删除
#3 wish@2008-11-08 18:25:00
回复 删除
但是需要先排序

所以复杂度仍然是 O(nlgn)

#4 pascal@2008-11-08 18:25:00
回复 删除
牛们来个程序
#5 pascal@2008-11-08 18:26:00
回复 删除
小弟比较弱
#6 青龙白狐@2008-11-08 18:27:00
回复 删除
var a,b:array[1..11000] of longint;

i,j,n,p,t,x,y,min,meth,ans:longint;

num:array[1..20000] of integer;

begin

readln(n);

fillchar(num,sizeof(num),0);

for i:=1 to n do

begin

read(t);

inc(num[t]);

b[i]:=1000000000

end;

p:=0;

for i:=1 to 20000 do

a[i]:=100000000;

for i:=1 to 20000 do

for j:=1 to num[i] do

begin

inc(p);

a[p]:=i

end;

x:=1;y:=1;ans:=0;

for i:=1 to n-1 do

begin

min:=maxlongint;

if (a[x]+a[x+1]<min) then begin

min:=a[x]+a[x+1];meth:=1

end;

if (a[x]+b[y]<min) then begin

min:=a[x]+b[y];meth:=2

end;

if (b[y]+b[y+1]<min) then begin

min:=b[y]+b[y+1];meth:=3

end;

b[i]:=min;

inc(ans,min);

if meth=1 then inc(x,2);

if meth=2 then begin inc(x);inc(y) end;

if meth=3 then inc(y,2)

end;

writeln(ans);

end.

类似基数排序,+贪心。

#7 pascal@2008-11-08 18:27:00
回复 删除
谢了!!
#8 子洋虾米@2008-11-08 21:10:00
回复 删除
基数排序啊```不大会
#9 zhangxile0807@2010-05-07 01:55:00
回复 删除
我的是O(N)但是10分
查看更多回复
提交回复