pascal 201错误 为什么 怎么解决?

[复制链接]
查看11 | 回复3 | 2009-6-7 20:54:04 | 显示全部楼层 |阅读模式
程序有点长,麻烦了
题目是http://www.vijos.cn/Problem_Show.asp?id=1237
var a:array[1..29999] of longint;

c:array[1..30000,1..30000] of extended;

n,i,j,k,m,temp:longint;

s:extended;
begin
{N+};
readln(n);
for i:=1 to n do read(a);
for i:=1 to n-1 do
begin
k:=i;
for j:=i to n do

if a[k]>a[j] then k:=j;
temp:=a[k]; a[k]:=a; a:=temp;
end;
if a[1]/a[n]>0.237 then begin

s:=abs(a[1]/a[n]-0.6180339887498949);

for i:=1 to n-1 do

for j:=i+1 to n do

if aa[j] then begin

c[i,j]:=abs(a/a[j]-0.6180339887498949);

if s>c[i,j] then begin


s:=c[i,j];


k:=i; m:=j;


end;

end;

end

else if a[1]/a[2]>0.37 then begin

s:=abs(a[1]/a[2]-0.6180339887498949);

for i:=1 to n-1 do

for j:=i to n do

if aa[j] then begin

c[i,j]:=abs(a/a[j]-0.6180339887498949);

if s>c[i,j] then begin


s:=c[i,j];


k:=i; m:=j;


end;

end;

end

elsebegin

s:=1000;

for i:=1 to n do

for j:=1 to n do

if (aa[j]) and (a/a[j]c[i,j] then begin


s:=c[i,j];


k:=i; m:=j;


end;


end;

end;
writeln(a[k]);
writeln(a[m]);
end.
我试啦,开到40000都不行
哪里改为int64

回复

使用道具 举报

千问 | 2009-6-7 20:54:04 | 显示全部楼层
看不懂程序你这个程序应该是O(n^2)的,对于30000的数据要超时的应该是先O(nlogn)快排一遍,然后对于每个数用二分法找出最接近这个数*0.618的数字更新答案,这样总复杂度是O(nlogn)的不会超时ps:膜拜楼上神牛...
回复

使用道具 举报

千问 | 2009-6-7 20:54:04 | 显示全部楼层
把a数组开大点...
回复

使用道具 举报

千问 | 2009-6-7 20:54:04 | 显示全部楼层
它测的数据范围是多少?...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行