1 和 4 TLE了,能来看看出了什么问题吗?
查看原帖
1 和 4 TLE了,能来看看出了什么问题吗?
783346
IsacBieber楼主2023/8/18 20:24

思路是:首先求个导得到二次函数,由题可知Δ>0,故设两根为bound1,bound2,那么三次函数求根的区间就是[-100,bound1], [bound1,bound2],[bound2,100]分别进行二分求根。

#include<bits/stdc++.h>
#define eps 1e-4
using namespace std;
typedef long double ld;
ld a,b,c,d;
ld f(ld x)
{
    return (a*x*x*x + b*x*x + c*x + d);
}
int main()
{
    scanf("%Lf %Lf %Lf %Lf",&a,&b,&c,&d);
    ld bound1 = (-b - sqrt(b*b-3*a))/(3*a), bound2 = (-b + sqrt(b*b-3*a))/(3*a);
    ld getl[4] = {-100.0,bound1,bound2}, getr[4] = {bound1,bound2,100.0};
    for(int i=0;i<3;i++)
    {
        ld l = getl[i], r = getr[i];
        while(r-l>eps)
        {
            ld mid = (l+r)/2;
            if(f(l)<0 && f(r)>=0)
            {
                if(f(mid)>=0) r = mid;
                else l = mid;
            } 
            else if(f(l)>=0 && f(r)<0)
            {
                if(f(mid)>=0) l = mid;
                else r = mid;
            } 
        }
        printf("%.2LF ",l);
    }
    return 0;
}
2023/8/18 20:24
加载中...