P1024 一道naive的二分

好吧,这道题思路还是比较简单的。整个程序大体上很快就打出来了,然后修改了解为整数的情况。

但是交上去一直是50分,最后我很无耻的看了题解,然后抄了一个玄学if回来,瞬间AC,不知道为什么。。。

这句就是玄学:

 1 if(f(i)*f(i+1)<0) 

好吧,下面来看AC代码(本题还可以用2*暴力来做,也很naive)

 1 #include <cstdio>
 2 #include <iostream>
 3 using namespace std;
 4 double a,b,c,d;
 5 double f(double x)
 6 {
 7     return a*x*x*x+b*x*x+c*x+d;
 8 }
 9 void tw(double l,double r)
10 {
11     if(r-l<=0.005)
12     {
13         printf("%.2f ",l);
14         return;
15     }
16     double mid=(l+r)/2.0;
17     double ll=f(l);
18     double rr=f(r);
19     if(ll==0)
20     {
21         printf("%.2f ",l);
22         return;
23     }
24     if(rr==0)
25     {
26         printf("%.2f ",r);
27         return ;
28     }
29     if(ll*rr>0) return;
30     double m=f(mid);
31     if(m==0)
32     {
33         printf("%.2f ",mid);
34         return;
35     }
36     if(m*ll<0) tw(l,mid);
37     else tw(mid,r);
38     return;
39 }
40 
41 int main()
42 {
43     cin>>a>>b>>c>>d;
44     for(double i=-101.0;i<=100.1;i++)
45     {
46 
47         if(f(i)==0.00)
48         {
49             printf("%.2f ",i);
50         }
51         if(f(i)*f(i+1)<0) tw(i,i+1);
52     }
53     return 0;
54 }
View Code

可以发现二分很冗杂...可以改进。

原文地址:https://www.cnblogs.com/huyufeifei/p/8515918.html