UVALive-7198 Tall orders 微积分 二分

题目链接:https://cn.vjudge.net/problem/UVALive-7198

题意

有悬链线方程$ f(x)=a cdot cosh(frac{s}{a}) $,
现有两个电线杆高p,水平距离d,上有电线。
这两个电线杆之间要通火车,这要求电线曲线最低点要离地面高4.2m。
给出p, d问电线长度L最长多少?

思路

简单积分题。
首先当然把参数a求出来,这里参数a只能是规定曲线的宽窄(很多人觉得a就是地面距最低点的距离,然而这俩没关系)。
有这样的方程:$ 4.2=p+a-a cdot cosh(frac{d}{2a}) $
有了这个方程就可以求a了,为了方便求a,我们可以研究一下函数关于a的单调性。
直接输出值看看得是单调就完事了,但是为了严谨,比赛结束求一下还是好的。
单调函数,这个a二分就好了。

电线长度就只能积分求解:

[egin{aligned} & 2int^{frac{d}{2}}_{0} sqrt{dx^2+dy^2} \ & =2int^{frac{d}{2}}_{0} sqrt{1+(frac{dy}{dx})^2} dx\ & =int^{frac{d}{2}}_{0} sqrt{4+(e^{frac{x}{a}}-e^{-frac{x}{a}})^2} dx\ & =int^{frac{d}{2}}_{0} e^{-frac{x}{a}} sqrt{e^{frac{4x}{a}}+2e^{frac{2x}{a}}+1} dx \ & =int^{frac{d}{2}}_{0} e^{frac{x}{a}}+e^{-frac{x}{a}} dx \ & =a(e^{frac{d}{2a}}-e^{-frac{d}{2a}}) end{aligned} ]

其中最后一步猜都可以猜出来,高中生水平做这个应该没有大问题。
(当年高二手推悬链线方程-_-,学校里写的研究报告到现在还没有进行评奖...)

提交过程

WA 注意向下取整
AC

代码

#include <cmath>
#include <cstdio>
#include <cstring>
const double eps2=1e-6, eps=1e-8;
double p, d;
bool equal(double a, double b){
	return (a-b)<eps && (b-a)<eps;
}

double func(double a){
	return a+p-a*cosh(d/(2*a));
}

double func2(double a){
	return a*(exp(d/(2*a))-exp(-1*d/(2*a)));
}

double solve(void){
	double l=1, r=1e4;

	while (l<r){
		double mid=(l+r)/2;
		if (func(mid)<4.2) l=mid;
		else r=mid;

		if (r-l<eps2) return r;
	}
}

int main(void){
	while (scanf("%lf", &p)==1){
		if (equal(p, -1)) break;
		scanf("%lf", &d);

		double a=solve();
		printf("%0.3lf
", floor((func2(a)*1000))/(double)1000);
	}

	return 0;
}
Time Memory Length Lang Submitted
None None 835 C++ 5.3.0 2018-08-20 03:38:48
原文地址:https://www.cnblogs.com/tanglizi/p/9513450.html