牛客小白月赛25 G 解方程

链接:https://ac.nowcoder.com/acm/contest/5600/G
来源:牛客网

题目描述
牛能作为一个学霸,非常擅长解方程。
有一天,他拿到了一个方程:
xa+blnx=cx^a+blnx=cxa+blnx=c
牛能当然一下子就解出了这个方程。但他想考考聪明的你,这个方程的解的多少?
输入描述:

三个正整数

输出描述:

如果解存在,请输出方程的解x的值,若你和正确答案的误差不超过 10−710^{-7}10−7 ,则认为你的答案正确。
如果解不存在,则输出。

示例1
输入
复制

3 5 1

输出
复制

1.00000000000000

二分法的模板 :
题目给出的函数很明显是单调增的
所以二分
浮点型的二分模板如下

while(rig-lef > 1e-9) {
	mid = (lef + rig) / 2; //注意这里不能用右移运算符
	double y = F(mid);
	if(y == C) break;
	if(y > C) 
		rig = mid;
	else
		lef = mid;
}

当然我跟喜欢下面这种

for(int i=1; i<=1000000; i++){
	mid = (lef + rig) / 2; //注意这里不能用右移运算符
	double y = F(mid);
	if(y > C)
	  rig = mid;
	else 
	  lef = mid;
}

完整代码如下

#define debug
#ifdef debug
#include <time.h>
#include "/home/majiao/mb.h"
#endif


#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <math.h>
#include <unordered_map>
#define MAXN ((int)1e6+7)
#define ll long long int
#define INF (0x7f7f7f7f)
#pragma GCC optimize(2)
#define QAQ (0)

using namespace std;

#ifdef debug
#define show(x...) \ do { \ cout << "\033[31;1m " << #x << " -> "; \ err(x); \ } while (0)
void err() { cout << "\033[39;0m" << endl; }
#endif

template<typename T, typename... A>
void err(T a, A... x) { cout << a << ' '; err(x...); }

int n, m, Q, K, A, B, C;

double eps = -1e7;

double F(double mid) {
	double ret = mid;
	for(int i=2; i<=A; i++)
		ret *= mid;
	ret += B*(log(mid));
	return ret;
}

double ABS(double x) {
	return x > 0.00000000 ? x : -x;
}

int main() {
#ifdef debug
	freopen("test", "r", stdin);
	clock_t stime = clock();
#endif
	scanf("%d %d %d ", &A, &B, &C);
	double lef = 0, rig = 1e9+7, mid, ans = 0;
#if 0
	for(int i=1; i<=1000000; i++){
		mid = (lef + rig) / 2;
		double y = F(mid);
		if(y > C) rig = mid;
		else {
			lef = mid;
		}
	}
	printf("%.14lf\n", mid);
#else 
	while(rig-lef > 1e-9) {
		mid = (lef + rig) / 2;
		double y = F(mid);
		if(y == C) break;
		if(y > C) rig = mid;
		else lef = mid;
	}
	printf("%.14lf\n", mid);
#endif



#ifdef debug
	clock_t etime = clock();
	printf("rum time: %lf 秒\n",(double) (etime-stime)/CLOCKS_PER_SEC);
#endif 
	return 0;
}


全部评论

相关推荐

11-09 01:22
已编辑
东南大学 Java
高级特工穿山甲:羡慕,我秋招有家企业在茶馆组织线下面试,约我过去“喝茶详谈”😢结果我去了发现原来是人家喝茶我看着
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务