HDU 2675 Equation Again

公式转化+二分答案

首先,把题目中给的等式转化一下,变成了这个样子。

等式右边的值是可以求出来的。

ln(x)/x的大致图像是这样的

 

那么只要对[0,e]和[e,+∞]分别进行二分答案即可。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

double Y,k;
const double e=2.71828182845904523536;

int main()
{
    while(~scanf("%lf",&Y))
    {
        k=(1+log(Y))/(e*Y);
        int flag=0;
        double l=0,r=e;
        double mid=(l+r)/2;
        if(k>1.0/e) {
            printf("Happy to Women’s day!\n");
            continue;
        }
        if(Y==1)
        {
            printf("2.71828\n");continue;
        }
        while(1)
        {
            if(fabs(log(mid)/mid-k)<0.000000000001) 
            {
                flag=1;
                printf("%.5lf ",mid);
                break;
            }
            if(log(mid)/mid>k)
            {
                r=mid;
                mid=(l+r)/2;
            }
            else
            {
                l=mid;
                mid=(l+r)/2;
            }
            if(fabs(l-r)<0.000000000001) break;
        }

        l=e,r=5000;
        mid=(l+r)/2;

        while(1)
        {
            if(fabs(log(mid)/mid-k)<0.00000000001) 
            {
                flag=1;
                printf("%.5lf\n",mid);break;
            }
            if(log(mid)/mid<k)
            {
                r=mid;
                mid=(l+r)/2;
            }
            else
            {
                l=mid;
                mid=(l+r)/2;
            }
            if(fabs(l-r)<0.000000000001) break;
        }
        if(!flag) printf("Happy to Women’s day!\n");
    }
    return 0;
}

 

posted @ 2015-10-09 18:20  Fighting_Heart  阅读(293)  评论(0编辑  收藏  举报