197 条题解

  • 0
    @ 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.

  • 0
    @ 2009-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

  • 0
    @ 2009-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)

  • 0
    @ 2009-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

  • 0
    @ 2009-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)

  • 0
    @ 2008-12-20 19:36:39

    此题 那啥 有点水。。。据说 水题涨RP的哦~

    本菜用了3min 13行搞定~~~

    欲看题解和分析请点

    http://hi.baidu.com/xieyu321/blog/item/63ceda34eb30881691ef39c6.html

  • 0
    @ 2008-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 有效耗时:0ms

    var

    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)

  • 0
    @ 2008-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.

    • @ 2015-08-07 10:49:02

      #include<cstdio>
      #include<cstring>
      using namespace std;
      int main()
      {
      double a,b,c,d;
      scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
      for (double i=-100;i<=100;i+=0.001)
      {
      double j=i+0.001;
      double y1 = a*i*i*i+b*i*i+c*i+d;
      double y2 = a*j*j*j+b*j*j+c*j+d;
      if (y1>=0 && y2<=0||y1<=0 && y2>=0)
      {
      double x=(i+j)/2;
      printf("%.2lf ",x);
      }
      }
      printf("\n");
      return 0;
      }

  • 0
    @ 2008-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)

  • 0
    @ 2008-11-12 13:56:18

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    判误差要1e-20...

  • 0
    @ 2008-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

  • 0
    @ 2008-11-11 07:54:35

    谁能告诉我为什么abs

  • 0
    @ 2008-11-10 14:12:36

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    Flag   Accepted

    题号   P1116

    类型(?)   数论 / 数值

    通过   2706人

    提交   5796次

    通过率   47%

    难度   1

    水啊,枚举都AC

  • 0
    @ 2008-11-10 13:44:04

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    program 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)

  • 0
    @ 2008-11-09 20:41:13

    庆祝一下。我是第2700个通过的,且通过了这题,我终于2颗星了!太兴奋了!

  • 0
    @ 2008-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)

  • 0
    @ 2008-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)

  • 0
    @ 2008-11-04 20:25:40

    如果用先枚举整数再枚举小数而整数不进行加减直接卡整数界上的话

    对于 0 -1 1 0 就会丢解..

  • 0
    @ 2008-11-03 21:02:48

    牛顿迭代就可以求出两个解,一个从-100开始,一个从100开始,这样就求出了最大和最小解,再从x1+1开始到x2-1开始尝试x=i和x=i+0.001时的值是否满足f(i)*f(i+0.001)

  • 0
    @ 2008-11-03 20:48:00

    我直接使用的全面搜索法,因为这个问题的数据规模不大。这里,我规定计算一次函数值为一次基操作,而这道题的解的精度是小数点后两位,即0.01,所以我从-100到100每0.01进行搜索。数据规模也是可以忍受的。(四个测试点全部通过)

    当然,当有三个解的时候,就不需要进行循环了,所以直接break。

信息

ID
1116
难度
5
分类
搜索 | 枚举 点击显示
标签
递交数
7804
已通过
2838
通过率
36%
被复制
14
上传者