197 条题解
-
0jiachina6 LV 3 @ 2009-02-08 09:50:43
program p1116;
var
a,b,c,d,k,t:real;
ans,p:array[1..3] of real;
i,j,i1:integer;
begin
readln(a,b,c,d);
for i:=1 to 3 do
p[i]:=9999;
for i:=-10000 to 10000 do
begin
k:=i/100;
j:=1;
while jabs(a*k*k*k+b*sqr(k)+c*k+d) then
begin
for i1:=j+1 to 3 do
begin
p[i1]:=p[i1-1];
ans[i1]:=ans[i1-1];
end;
p[j]:=abs(a*k*k*k+b*sqr(k)+c*k+d);
ans[j]:=k;
break;
end
else
inc(j);
end;
end;
for i:=1 to 2 do
for j:=i+1 to 3 do
if ans[i]>ans[j] then
begin
t:=ans[i];
ans[i]:=ans[j];
ans[j]:=t;
end;
writeln(ans[1]:0:2,' ',ans[2]:0:2,' ',ans[3]:0:2);
end.end.
-
02009-06-10 16:32:09@
似乎穷举最简单,但我还是喜欢分治+递归,第一次写分治一次AC爽啊
#include
using namespace std;
const double e = 0.001;
double a,b,c,d;
double x[3];
int k = 0;
double f(double x){ return a*x*x*x + b*x*x + c*x + d;}
void run(double a,double b)
{
double c = (a+b)/2;
if(b - a < 1 && f(a)*f(b) > 0) return;
if(b - a < e || f(c) == 0){x[k++] = c; return;}
if(f(a)*f(c) < 0 || k < 3) run(a,c);
if(f(c)*f(b) < 0 || k < 3) run(c,b);
}
int main()
{
cin >> a >> b >> c >> d;
run(-100,100);
cout.setf(ios::fixed);
cout.precision(2);
for(int i = 0 ; i < 3;i++) cout -
02009-01-25 08:12:43@
水题
直接穷举 哈哈
program dd;
var
a,b,c,d,x:real;
i:longint;
begin
read(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) -
02009-01-19 23:58:22@
#include
#define f(x) (a*x*x*x+b*x*x+c*x+d)
#define E 1e-2
double a,b,c,d;
double findsol(double x1,double x2) { //二分法
double xmid=(x1+x2)/2;
if(x2-x1 -
02009-01-02 22:52:09@
program P1116;
var x:integer;
a,b,c,d,x1,x2:extended;
function f(x:extended):extended;
begin
f:=x*x*x+b*x*x+c*x+d;
end;
begin
read(a,b,c,d);
for x:=-10000 to 10000 do
begin
x1:=(x-0.05)/100;
x2:=(x+0.05)/100;
if (f(x1)*f(x2) -
02008-12-20 19:36:39@
此题 那啥 有点水。。。据说 水题涨RP的哦~
本菜用了3min 13行搞定~~~
欲看题解和分析请点
http://hi.baidu.com/xieyu321/blog/item/63ceda34eb30881691ef39c6.html -
02008-12-09 17:16:47@
var a,b,c,d,x,s:real;
i:integer;
function f(x:real):real;
begin
f:=a*x*x*x+b*x*x+c*x+d;
end;
begin
readln(a,b,c,d);
x:=-100;
for i:= 1 to 3 do
begin
repeat
s:=f(x);
if abs(s) < 0.001 then write(x:0:2,' ');
x:=x+0.01;
until abs(s) < 0.001 ;
x:=x+1;
end;
end.编译通过...
├ 测试数据 01:运行超时...
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Unaccepted 有效得分:75 有效耗时:0msvar
a,b,c,d,s:extended;
i,tim:integer;
begin
readln(a,b,c,d);
tim:=0;
for i:=-10000 to 10000 do
begin
s:=i/100;
if abs(s*s*s*a+s*s*b+s*c+d) -
02008-12-08 13:32:23@
program p1116;
var
a,b,c,d,k,t:real;
ans,p:array[1..3] of real;
i,j,i1:integer;
begin
readln(a,b,c,d);
for i:=1 to 3 do
p[i]:=9999;
for i:=-10000 to 10000 do
begin
k:=i/100;
j:=1;
while jabs(a*k*k*k+b*sqr(k)+c*k+d) then
begin
for i1:=j+1 to 3 do
begin
p[i1]:=p[i1-1];
ans[i1]:=ans[i1-1];
end;
p[j]:=abs(a*k*k*k+b*sqr(k)+c*k+d);
ans[j]:=k;
break;
end
else
inc(j);
end;
end;
for i:=1 to 2 do
for j:=i+1 to 3 do
if ans[i]>ans[j] then
begin
t:=ans[i];
ans[i]:=ans[j];
ans[j]:=t;
end;
writeln(ans[1]:0:2,' ',ans[2]:0:2,' ',ans[3]:0:2);
end. -
02008-12-06 22:38:17@
program asdf;
var
a,b,c,d,x1,x2:real;
i:integer;
first:boolean;
function f(k:real):real;
begin
f:=a*k*k*k+b*k*k+c*k+d;
end;
begin
readln(a,b,c,d);
first:=true;
for i:=-10000 to 10000 do
begin
x1:=i/100;
x2:=(i+1)/100;
if f(x1)=0 then
begin
if first then write(x1:0:2)
else write(' ',x1:0:2);
first:=false;
continue;
end;
if f(x1)*f(x2) -
02008-11-12 13:56:18@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms
判误差要1e-20... -
02008-11-11 13:01:34@
program function;
var temp,a,b,c,d:real;
num:integer;function f(x:real):real;
begin
f:=a*x+b;
f:=f*x+c;
f:=f*x+d;
end;begin
read(a,b,c,d);
temp:=-100;
num:=0;
while num -
02008-11-11 07:54:35@
谁能告诉我为什么abs
-
02008-11-10 14:12:36@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms
Flag Accepted
题号 P1116
类型(?) 数论 / 数值
通过 2706人
提交 5796次
通过率 47%
难度 1水啊,枚举都AC
-
02008-11-10 13:44:04@
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0msprogram v1116;
var
a,b,c,d,s:extended;
i,j:integer;
begin
readln(a,b,c,d);
for i:=-10000 to 10000 do
begin
s:=i/100;
if abs(s*s*s*a+s*s*b+s*c+d) -
02008-11-09 20:41:13@
庆祝一下。我是第2700个通过的,且通过了这题,我终于2颗星了!太兴奋了!
-
02008-11-08 14:59:20@
只有4个测试数据?晕 +_+
何谓弱题?就是出题者想让用的方法由于测试数据的简单使得做题者可以不用,而用其他方法也能过的题。 就如本题1.只有4个测试数据且十分简单2.做题者想让我们用二分法,但实际上用枚举也可以过3.用枚举不超时甚至更快,写法更简,思路更明
var
a,b,c,d,e:real;
i,j:integer;
begin
readln(a,b,c,d);
for i:=-10000 to 10000 do
begin
e:=i/100;
if abs(e*e*e*a+e*e*b+e*c+d) -
02008-11-07 13:25:11@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms好弱的题,枚举就搞定了。。。虽然出题者想叫我们用二分
var
a,b,c,d,re:real;
i,t:integer;
begin
readln(a,b,c,d);
t:=0;
for i:=-10000 to 10000 do
begin
re:=i/100;
if abs(re*re*re*a+re*re*b+re*c+d) -
02008-11-04 20:25:40@
如果用先枚举整数再枚举小数而整数不进行加减直接卡整数界上的话
对于 0 -1 1 0 就会丢解..
-
02008-11-03 21:02:48@
牛顿迭代就可以求出两个解,一个从-100开始,一个从100开始,这样就求出了最大和最小解,再从x1+1开始到x2-1开始尝试x=i和x=i+0.001时的值是否满足f(i)*f(i+0.001)
-
02008-11-03 20:48:00@
我直接使用的全面搜索法,因为这个问题的数据规模不大。这里,我规定计算一次函数值为一次基操作,而这道题的解的精度是小数点后两位,即0.01,所以我从-100到100每0.01进行搜索。数据规模也是可以忍受的。(四个测试点全部通过)
当然,当有三个解的时候,就不需要进行循环了,所以直接break。