uva 1356/LA 3485 Bridge 题解

题意:有一座桥,桥上等距摆若干个塔,高度H,宽度不计。相邻两个塔距离不超过D。有一个绳索,总长度为L,桥的长度为L,两个塔之间的绳索成全等的抛物线。求建最少的塔的时候绳索下端离地高度y。

白书上的例题。。我基本上是抄的代码。

间隔数n=ceil(B/D),每个间隔宽度D‘=B/n,之间的绳索长度L‘=L/n。则抛物线的宽度已知,即D‘。

根据微积分知识,可导函数f(x)在区间[a,b]上的弧长为\(\int_{b}^{a} \sqrt{1+[f‘(x)]^2}dx\) 。

则此时抛物线的长度只与其高度h有关,且随h增单调递增,二分答案即可。

求积分用simpson比较好。好想也好写。

 1 #include<cstdio>
 2 #include<cmath>
 3 double a;
 4 inline double f(double x)
 5 {
 6     return sqrt(1+4*a*a*x*x);
 7 }
 8 inline double simpson(double a,double b)
 9 {
10     double c=a+(b-a)/2;
11     return (f(a)+4*f(c)+f(b))*(b-a)/6;
12 }
13 double asr(double a,double b,double eps,double A)
14 {
15     double c=a+(b-a)/2;
16     double L=simpson(a,c),R=simpson(c,b);
17     if(fabs(L+R-A)<=15*eps) return L+R+(L+R-A)/15.0;
18     else return asr(a,c,eps/2,L)+asr(c,b,eps/2,R);
19 }
20 int T;
21 int D,H,B,L;
22 int main()
23 {
24 //    freopen("1.in","r",stdin);
25     scanf("%d",&T);
26     for(int kase=1;kase<=T;++kase)
27     {
28         scanf("%d%d%d%d",&D,&H,&B,&L);
29         int n=(B+D-1)/D;
30         double D1=(double)B/n,L1=(double)L/n;
31         double x=0,y=H;
32         while(y-x>1e-7)
33         {
34             double m=x+(y-x)/2;
35             a=4*m/(D1*D1);
36             if(asr(0,D1/2,1e-6,simpson(0,D1/2))*2<L1) x=m;
37             else y=m;
38         }
39         if(kase>1) putchar(10);
40         printf("Case %d:\n%.2f\n",kase,H-x);
41     }
42     return 0;
43 }
时间: 2024-12-29 09:44:21

uva 1356/LA 3485 Bridge 题解的相关文章

UVA 1356 - Bridge(自适应辛普森)

UVA 1356 - Bridge 题目链接 题意:一个桥长为B,桥上建电线杆,杆高为H,两杆之间距离不超过D,电线杆总长为L,杆子都是等距的,现在建最少的电线杆,问这时候电线离地面高度是多少 思路:二分高度,求出电线长,判断长度够不够即可,那么问题就变成怎么求弧长 求弧长公式为∫w/201+(f′(x)2)??????????√, 建立坐标系使得f(x)=ax2,带入点(w/2, h)求出a,得到方程 那么问题就变成怎么求这个积分了 利用辛普森自适应法,去求即可 代码: #include <c

uva 1356 - Bridge(积分+二分)

题目链接:uva 1356 - Bridge 题目大意:在一座长度为B的桥上建若干个塔,塔的间距不能超过D,塔的高度为H,塔之间的绳索形成全等的抛物线.绳索的总长度为L.问在建最少塔的情况下,绳索的最下段离地面的高度. 解题思路:贪心的思想求出最少情况下建立的塔数. 二分高度,然后用积分求出两塔之间绳索的长度. C++ 积分 #include <cstdio> #include <cstring> #include <cmath> #include <algori

UVa - 457 - Linear Cellular Automata 题解

本题大概题意: 给出一个数组DNA,包含10个数值,如:DNA[10] = {0,1,2,3,,1,2,3,0,1,2}所有数值应该不大于3. 给出一行40个字符的字符串: 空格代表0, '.'代表1,'x'代表2,'W'代表3. 相邻三个数值(或两个数值)相加得到的数作为DNA的下标,然后取DNA数组改下标的数值为新的值.产生新的字符串. 好难说清楚,看原文吧,的确是很难理解的题目: http://uva.onlinejudge.org/index.php?option=com_onlinej

UVA - 1356 Bridge

Description A suspension bridge suspends the roadway from huge main cables, which extend from one end of the bridge to the other. These cables rest on top of high towers and are secured at each end by anchorages. The towers enable the main cables to

LA 3485 (积分 辛普森自适应法) Bridge

桥的间隔数为n = ceil(B/D),每段绳子的长度为L / n,相邻两塔之间的距离为 B / n 主要问题还是在于已知抛物线的开口宽度w 和 抛物线的高度h 求抛物线的长度 弧长积分公式为: 设抛物线方程为f(x) = ax2,则这段抛物线弧长为 查积分表或者自己分部积分算一下:  二分抛物线高度x,使得每段抛物线长度为L / n,所求答案为H - x 1 #include <cstdio> 2 #include <cmath> 3 4 inline double F(doub

UVa 11846 Finding Seats Again 题解

难度:β 建议用时:40 min 实际用时:1 h 题目:?? 代码:?? 这题我又是在很短时间 A 过去. 因为我又看别人的题解了. 这题用 DFS 搜索,剪枝没什么的. 搜索方案就是从一个固定点开始往下往右(根据我自己的坐标系来看)拉出一个矩型,然后判断有几个队长,符不符合队长要求的人数条件,然后吧啦吧啦继续搜. 很简单的(看完题解后的我想到). 就是在处理矩形上面要注意一下细节.剪枝就是减掉枚举时矩形的边的范围,使新画的矩形不会和之前的重合. 我好奇的是为什么只剪列,不剪行.这个细节值得思

UVa 1362(LA 3516) Exploring Pyramids

依旧是<训练指南>上的一道例题.思路大致相同,即设有一个序列S(i),S(i+1),S(i+2)...S(j),d[i,j]为所求的解.当S(i)==S(k),i<k<=j 时,说明在k回到根,那么S(i+1)...S(k-1)构成一棵独立的子树(当然也可能并不是子树).那么d[i,j]就要加上d[i+1,k-1]*d[k,j],不断递增k,每遇到一个k,d[i,j]+=d[i+1,k-1]*d[k,j]直到k>j.最后的d[i,j]就是序列S(i)..S(j)的解.那么题目

UVa 817 According to Bartjens 题解

难度:β 建议用时:40 min 实际用时:4 h 题目:?? 代码:?? 这题有两个坑点首先要注意: 1)对于 "2000=" 要特判.应该判为 "IMPOSSIBLE" 2)枚举顺序为 "*+-" 然后是数字. 好了.这题的 DFS 过程很简单了.主要的是怎样计算一个字符串多项式(不带除号的). 代码链接:??(这里我把除号带上了,原理跟减号一样的) 从最简单的加法开始. 1+2+3 怎样计算上面的式子? 我选择用递归. 从左到右(不是遍历,

UVa 1606 Amphiphilic Carbon Molecules 题解

难度:β 建议用时:40 min 实际用时:1 h 题目:?? 代码:?? 这题我看了刘汝佳大神的代码,在上面改了几个变量的名称,方便理解. 这是一道简单的几何题(不是真正的集合题,更可以说是一个坐标题),所以长话短说了. 题目告诉我们有一些随机分布的点,要我们用一个隔板把平面分开,然后往两边分别倒入水和丙酮来溶解掉这些点. 然而这些点有的只能溶解在水里,有的只能溶解到丙酮里. 任务是找到最大的溶解的点的数量. 这题建模就是按照刘汝佳大神的方法,一个隔板分开平面,要使左侧黑点数加右侧白点数的和最