【hdu2675】Equation Again——二分

题目:

Equation Again

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1470    Accepted Submission(s): 458


Problem Description
This problem’s author is too lazy to write the problem description, so he only give you a equation like X (eY) == (eY) x, and the value of Y, your task is calculate the value of X. 
Note : here e is the Natural logarithm.
 

Input
Each line will contain one number Y(Y >= 1). Process to end of file.
 

Output
For each case, output X on one line, accurate to five decimal places, if there are many answers, output them in increasing order, if there is no answer, just output “Happy to Women’s day!”.
 

Sample Input
  
  
1
 

Sample Output
  
  
2.71828
 

Author
WhereIsHeroFrom
 

Source
 

Recommend
lcy   |   We have carefully selected several similar problems for you:   2668  2670  2671  2673  2672 

描述:给出二元方程和y的值,求x的值

题解:对给出的式子两边取自然对数把指数放下来,x,y分别放在等式两边得到新的关系,右边是1/e乘以y的多项式。y=1时多项式的值为1。对左边,求导可以看到是一个先增后减的函数,在x=e处取最大值,那么枚举时超过e时的值就可以直接舍弃了,剩下的二分枚举,y!=1时有两个解。

代码:

#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
const double ee = 2.718281828459;
const double eps = 1e-7;
int main()
{
	double x, y;
	
	while (scanf("%lf", &y) != EOF)
	{
		double tmp = (1 + log(y)) / (y*ee);
		double low = 1 + eps, hei = ee - eps, mid;
		if (tmp*ee - 1>eps) 
		{ 
			puts("Happy to Women’s day!"); 
			continue; 
		}
		while (hei - low>eps)
		{
			mid = (hei + low) / 2;
			if (log(mid)*(y*ee)>(1 + log(y))*mid)
				hei = mid;
			else
				low = mid;
		}
		if (y == 1)printf("%.5lf\n", (hei + low) / 2);
		else  if (y>1)
		{
			double ans = (hei + low) / 2;
			low = ee + eps, hei = 1e9 + eps;
			while (hei - low>eps)
			{
				mid = (hei + low) / 2;
				if (log(mid)*(y*ee)<(1 + log(y))*mid)
					hei = mid;
				else
					low = mid;
			}
			printf("%.5lf %.5lf\n", ans, (hei + low) / 2);
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值