HDU3714 Error Curves

这道题为了写题解花了不少时间。。
卡精度。。
做法是三分。。

#include<stdio.h>
struct fx
{
    double a,b,c;//这里要double的原因是防止testy的退化,一开始我就错在这里,要逐渐培养意识,不让这种低级错误发生!!!//
}xishu[10010];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        int i;
        for(i=1;i<=n;i++)
            scanf("%lf%lf%lf",&xishu[i].a,&xishu[i].b,&xishu[i].c);
        double left=0;
        double right=1000;
        double mid1,mid2;
        double testy;
        double ans;
        while(right-left>0.000000001)//这个数字是我wa好多次二分出来的..不能少一个0,但是愿意的话可以多加几个0//
        {
            mid1=(left+right)/2;//之所以除2,是因为满足精度。不然似乎在double范围内出不来答案。//
            mid2=(mid1+right)/2;
            double y1=-0x3f3f3f3f;
            double y2=-0x3f3f3f3f;
            for(i=1;i<=n;i++)
            {
                testy=xishu[i].a*mid1*mid1+xishu[i].b*mid1+xishu[i].c;
                if(testy>y1)
                    y1=testy;
                testy=xishu[i].a*mid2*mid2+xishu[i].b*mid2+xishu[i].c;
                if(testy>y2)
                    y2=testy;
            }
                if(y1>y2)
                    left=mid1;
                else
                    right=mid2;
                if(right-left<=0.000000001)
                ans=y2;//这里y1,y2无所谓的,因为精度确定了,一定在精度附近。//
        }
        printf("%.4lf\n",ans);
        }

    return 0;
}

你可能感兴趣的:(hdu-三分)