HDU 2675 Equation Again

这道题我一开始看起来水水的,然后我掉到坑里去了,我wa了好多次。。
首先化简函数,求导,具体的思路就有了。
1的时候是极值 特殊考虑
右边的答案直接可以算出,左边二分。。
我用了2个方式写出口。。后一种无脑。。

#include<stdio.h>
#include<math.h>
int main()
{
    double x,y;
    while(scanf("%lf",&y)!=EOF)
    {
        double x=exp(1)*y;
        if(y==1)
             printf("2.71828\n");
        else
        {
            double logo=log(x)/x;
            double left=0;
            double right=exp(1);
            double mid;
            while(right-left>=0.0000001)
            {
                mid=(left+right)/2;
                if(log(mid)/mid<logo)
                    left=mid;//这里很关键。。一开始以为left=mid-0.0000001。。wa了。。我认为这样有可能让left变得大于answer。。下同。。还是要好好考虑啊。。//
                else if(log(mid)/mid>logo)
                    right=mid;
                else
                {
                    left=mid;
                    right=mid;
                    break;
                }
            }
            printf("%.5lf %.5lf\n",(right+left)/2,x);//wa了太多次。。怕了。。于是就再二分一次。。//
        }

    }
    return 0;
}

下面是一种我实在不能忍才写的写法。。

#include<stdio.h>
#include<math.h>
int main()
{
    double x,y;
    while(scanf("%lf",&y)!=EOF)
    {
        double x=exp(1)*y;
        if(y==1)
             printf("2.71828\n");
        else
        {
            double logo=log(x)/x;
            double left=0;
            double right=exp(1);
            double mid;
            int z=150;
            while(z--)//直接二分150次//
            {
                mid=(left+right)/2;
                if(log(mid)/mid<logo)
                    left=mid;
                else if(log(mid)/mid>logo)
                    right=mid;
                else
                {
                    left=mid;
                    right=mid;
                    break;
                }
            }
            printf("%.5lf %.5lf\n",(right+left)/2,x);
        }

    }
    return 0;
}

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