UVA 3485 Bridge
生活随笔
收集整理的這篇文章主要介紹了
UVA 3485 Bridge
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目大意
你的任務是修建一座大橋。橋上等距地擺放著若干個塔,塔高為H,寬度忽略不計。相鄰兩座塔之間的距離不能超過D。塔之間的繩索形成全等的對稱拋物線。橋長度為B,繩索總長為L,如下圖所示求建最少的塔時繩索的最下端離地的高度y。
【輸入格式】
輸入第一行為測試數據組數T。每組數據包含4個整數D,H,B,L(B<=L)。
【輸出格式】
對于每組數據,輸出繩索底部離地高度,保留兩位小數。
間隔數為n=[(B+D-1)/D],所以間隔和每個間隔的繩子長分別為w=B/n,L=L/n
根據微積分,一個二次函數的弧長len=∫√(1+[f'(x)]2)
不懂看https://wenku.baidu.com/view/7c3f0a8a02d276a200292e12.html
因為要確定y=kx2的k,找到可以使len=L的k,len的計算用辛普森
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 double k,D,H,B,L,eps=1e-5,ans,Eps=1e-5; 8 double F(double X) 9 { 10 return sqrt(1+4.0*k*k*X*X); 11 } 12 double simpson(double l,double r) 13 { 14 return (r-l)*(F(l)+F(r)+4.0*F((l+r)/2.0))/6.0; 15 } 16 double asr(double l,double r,double eps,double A) 17 { 18 double mid=(l+r)/2.0; 19 double LS=simpson(l,mid),RS=simpson(mid,r); 20 if (fabs(LS+RS-A)<=15.0*eps) return LS+RS+(LS+RS-A)/15.0; 21 return asr(l,mid,eps/2.0,LS)+asr(mid,r,eps/2.0,RS); 22 } 23 int main() 24 {int T,t,cnt; 25 double w; 26 cin>>T; 27 while (T--) 28 { 29 scanf("%lf%lf%lf%lf",&D,&H,&B,&L); 30 int n=(B+D-1)/D; 31 w=B/(double)n; 32 L=L/(double)n; 33 double l=0,r=H; 34 while (l+Eps<r) 35 { 36 double mid=(l+r)/2.0; 37 k=4.0*mid/(w*w); 38 if (2.0*asr(0,w/2.0,eps,simpson(0,w/2.0))-L<Eps) ans=mid,l=mid; 39 else r=mid; 40 } 41 cnt++; 42 if (cnt>1) printf("\n"); 43 printf("Case %d:\n%.2lf\n",cnt,H-ans); 44 } 45 }?
轉載于:https://www.cnblogs.com/Y-E-T-I/p/8288066.html
總結
以上是生活随笔為你收集整理的UVA 3485 Bridge的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: post 方式提交XML文件调用接口
- 下一篇: 国内初创企业选择云计算服务器价格对比