牛客小白月赛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;
}


全部评论

相关推荐

ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
听说改名字就能收到offer哈:Radis写错了兄弟
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务