讨论 / 为什么我的程序全部输出32767?
abcwuhang 2012-08-31 23:46:00
点我顶贴 收藏 删除
program rq42;

var n,k:integer;

a,f:array [1..5000] of longint;

function min(x,y:longint):longint;

begin

if x>y then exit(y)

else exit(x);

end;

function max(x,y:integer):integer;

begin

if x>y then exit(x)

else exit(y);

end;

procedure swap(var x,y:longint);

var z:longint;

begin

z:=x;

x:=y;

y:=z;

end;

procedure init;

var i:integer;

begin

for i:=1 to n do

begin

f[i]:=maxint;

readln(a[i]);

end;

if a[1]>a[n] then

for i:=1 to n div 2 do

swap(a[i],a[n-i+1]);

end;

function getk(x,y:integer):real;

begin

getk:=(a[x]-a[y])/(x-y);

end;

procedure main;

var i,j:integer;

k1,k2:real;

begin

f[1]:=1;

for i:=2 to n do

begin

k2:=maxlongint;

for j:=i-1 downto max(i-k,1) do

if a[j]<=a[i] then

begin

k1:=getk(i,j);

if k1-k2<1e-5 then

begin

f[i]:=min(f[i],f[j]+1);

k2:=k1;

end;

end else break;

end;

writeln(f[n]);

end;

begin

readln(n,k);

init;

main;

end.

#1 abcwuhang@2009-08-29 01:29:00
回复 删除
我知道有一个地方:

把k1-k2<1e-5那个if条件判断里的k2:=k1放到外面一层,但是这样改了还是有问题,(依旧全输出32767),为什么?

#2 ceshiyong@2009-08-29 01:37:00
回复 删除
我前面也是被这题困了很久,也是全输出maxint。后来时发现判断斜率的时候判断错了,pascal不太看得懂~不过我觉得应保持i到j间的最大斜率,所以我觉得在j循环外的k2应为一个极小值,因为斜率可为负~~说的可能不对,仅供参考。
#3 ceshiyong@2009-08-29 01:39:00
回复 删除
还有,这是用来处理什么的~ 。~

if a[1]>a[n] then

for i:=1 to n div 2 do

swap(a[i],a[n-i+1]);

#4 abcwuhang@2009-08-29 02:24:00
回复 删除
LS:是保证a[1]<a[n],即选择的点为单调递增的。。

我查过题解,和我的几乎一样,但为什么我的全是maxint??

晕ing @v@

#5 abcwuhang@2009-09-11 02:11:00
回复 删除
顶上来
#6 sxsxsx123890@2011-03-02 05:27:00
回复 删除
我输出f[i],(i=n),全错

我输出f[n],全对

#7 jimmy_qian@2012-08-31 05:50:00
回复 删除
32767?

32767应该是integer的最大值吧

#8 刘载清@2012-08-31 23:46:00
回复 删除
回复 地壳jimmy_qian 的帖子

就是maxint……

查看更多回复
提交回复