最开始我zz的想法是直接把整个区间二分,但后来才发现只能找到一个。
然后看了下题解,因为每个长度为1的区间只可能有一个解,所以直接枚举每一个长度为1的区间来二分即可。只需要注意区间不能重复,所以可以把右端点减一个很小的数即可。
我犯的最智障的错误莫过于用快读来读了double
。。。而且改了半天今早才想起,感觉白学OI了。
#define eps 1e-2
double a,b,c,d,ans[5];
int cnt;
inline bool check(double x)
{
double sum=a*x*x*x+b*x*x+c*x+d;
if (fabs(sum)<=eps) return 1;
return 0;
}
inline bool check2(double x,double y)
{
double sum1=a*x*x*x+b*x*x+c*x+d,sum2=a*y*y*y+b*y*y+c*y+d;
if (sum1*sum2<0) return 1;
return 0;
}
int main()
{
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
for (int i=-100;i<100;i++)
{
double l=i,r=i+1-eps;
while (r-l>=1e-8)
{
double mid=(l+r)/2;
int chk=check(mid);
if (chk)
{
ans[++cnt]=mid;
break;
}
if (check2(mid,r)) l=mid;
else r=mid;
}
}
for (int i=1;i<=cnt;i++) printf("%.2f ",ans[i]);
return 0;
}