【LA3485】 Bridge

前言

哈哈哈,垃圾微积分哈哈哈
前置知识:自适应Simpson法与微积分初步学会编程

Solution

考虑一下我们有的是什么:

一段桥梁的横向距离,悬线的长度,以及高度。

我们发现如果我们重新设一个元\(h=H-x\),那么很显然就有\(x=H-h\)

这个时候感觉\(h\)好求一些

那么怎么做?

可以根据\(h\)\(d\)算出悬线长度,然后直接二分答案就好了。(注意按照格式输出)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<iostream>
using namespace std;
#define ll long long
#define re register
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
inline int gi(){
	int f=1,sum=0;char ch=getchar();
	while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
	return f*sum;
}
double a;
double F(double x){
	return sqrt(1+4*a*a*x*x);
}
double Simpson(double a,double b){
    double c=a+(b-a)/2;
    return (F(a)+4*F(c)+F(b))*(b-a)/6;
}
double simpson(double a,double b,double eps,double A){
    double c=a+(b-a)/2;
    double L=Simpson(a,c),R=Simpson(c,b);
    if(fabs(L+R-A)<=eps*15)return L+R+(L+R-A)/15;
    return simpson(a,c,eps/2,L)+simpson(c,b,eps/2,R);
}
double Ask(double a,double b,double eps){
    return simpson(a,b,eps,Simpson(a,b));
}
double check(double d,double h){
	a=4.0*h/(d*d);
	return Ask(0,d/2,1e-5)*2;
}
const double eps=1e-5;
int main(){
	int T=gi();
	for(int Case=1;Case<=T;Case++){
		printf("Case %d:\n",Case);
		int D,H,B,L;
		scanf("%d%d%d%d",&D,&H,&B,&L);
		int n=(D+B-1)/D;
		double d=(double)B/n;
		double l=(double)L/n;
		double x=0,y=H;
		while(y-x>eps){
			double mid=x+(y-x)*0.5;
			if(check(d,mid)<l)x=mid;
			else y=mid;
		}
		printf("%.2lf\n",H-x);
		if(Case!=T)puts("");
	}
	return 0;
}
posted @ 2019-01-14 15:12  QwQGJH  阅读(175)  评论(0编辑  收藏  举报