noip2001-一元三次方程 2008.11.5
发散给的启示:
1把误差定位很小时,就可以通过,因为精度是0.001,所以,0.001^3=0.000001就是误差范围了
2 题中的话一般都不是废话,他给出了精度之类的东西,就是让用的,必定是判定条件,或者是对算法有提示,或者是对数据规模有提示
法一:wa一组
program p_3cfc;
const fin='3cfc.in';fout='3cfc.out';
var f1,f2:text;
i,j,l:longint;
a,b,c,d,x,y:real;
p:array[1..3]of real;
r:array[1..3]of real;
procedure put(y,x:real);
var i:longint;
begin
if l<3 then begin inc(l);p[l]:=y;r[l]:=x;end
else
if y<=p[1] then begin p[3]:=p[2];p[2]:=p[1];p[1]:=y;
r[3]:=r[2];r[2]:=r[1];r[1]:=x;
end
else if y<=p[2]
then begin
p[3]:=p[2];p[2]:=y;
r[3]:=r[2];r[2]:=x;
end
else
if y<=p[3]
then begin p[3]:=y;r[3]:=x;end;
end;
begin
assign(f1,fin);reset(f1);
assign(f2,fout);rewrite(f2);
read(f1,a,b,c,d);l:=0;
for i:=-10000 to 10000 do
begin x:=i/100;
y:=abs(x*x*x*a+x*x*b+x*c+d);
put(y,x);
end;
for i:=1 to 3 do
for j:=i+1 to 3 do
if r[i]>r[j] then
begin
x:=r[i];r[i]:=r[j];r[j]:=x;end;
write(f2,r[1]:2:2,' ',r[2]:2:2,' ',r[3]:2:2);
close(f1);close(f2);
end.
法二:program MayLava;
var
a,b,c,d,u,v:real;
i,j,k:integer;
x:array[1..3] of real;
fii:text;
function f(x:real):real;
begin
f:=x*x*x*a+x*x*b+x*c+d;
end;
begin
assign(fii,'3cfc.in');
reset(fii);
readln(fii,a,b,c,d);
close(fii);
for i:=-100 to 99 do begin
u:=i;
v:=u+0.999999999;
if (abs(f(u))<0.0000001)or(f(u)*f(v)<0) then begin
for j:=1 to 200 do begin
v:=u+0.005;
if (abs(f(u))<0.0000001)or(f(u)*f(v)<0) then begin
inc(k);
x[k]:=u;
break;
end;
u:=u+0.005;
end;
end;
end;
rewrite(fii);
writeln(fii,x[1]:0:2,' ',x[2]:0:2,' ',x[3]:0:2);
close(fii);
end.
法三:
program EmberAsh;
var
i:longint;
a,b,c,d,x:real;
BEGIN
assign(input,'3cfc.in');
reset(input);
assign(output,'3cfc.out');
rewrite(output);
readln(a,b,c,d);
for i:=-10000 to 10000 do
begin
x:=i/100;
if abs(a*x*x*x+b*x*x+c*x+d)<0.00001 then write(x:0:2);
end;
close(input);close(output);
END.