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(double a, double x)
 5 {//sqrt(a^2+x^2)的原函数
 6     double a2 = a*a, x2 = x*x;
 7     double s = sqrt(a2+x2);
 8     return (x*s + a2*log(x+s))/2;
 9 }
10
11 double length(double w, double h)
12 {//宽为w,高为h的抛物线的长度
13     double a = 4*h/w/w;
14     double b = 0.5/a;
15     return 4*a*(F(b, w/2) - F(b, 0));
16 }
17
18 int main()
19 {
20     //freopen("in.txt", "r", stdin);
21
22     int T;
23     scanf("%d", &T);
24     for(int kase = 1; kase <= T; kase++)
25     {
26         int D, H, B, L;
27         scanf("%d%d%d%d", &D, &H, &B, &L);
28         int n = (B-1)/D + 1;    //间隔数
29         double d = (double)B / n; //间隔
30         double l = (double)L / n;   //每段绳长
31         double Left = 0, Right = H;
32         while(Right - Left > 1e-5)
33         {//二分求抛物线高度
34             double mid = (Right + Left) / 2;
35             if(length(d, mid) > l) Right = mid;
36             else Left = mid;
37         }
38         if(kase > 1) puts("");
39         printf("Case %d:\n%.2f\n", kase, H-Left);
40     }
41
42     return 0;
43 }

代码君

时间: 2024-07-29 09:16:07

LA 3485 (积分 辛普森自适应法) Bridge的相关文章

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\) . 则此时抛物线的长度只与

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

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

BZOJ 2178 圆的面积并 Simpson积分

题意:链接 方法: Simpson积分 解析: 这题是有正解的=-= 不过Simpson积分可过. 首先 ∫rlf(x)=(r?l)(f(l)+f(r)+4f(mid))6 然后就强行递归搞就行了. 至于f(i)的值,在本题就是x=i这条直线与所有可以相交的圆的截线长的和. 这个的话用勾股定理求即可. 然后有一个方法 Simpson积分自适应法=-= 我们只需要强行套用公式,然后检验左半边的如上函数值加上右半边的如上函数值与我们强行套用公式得出来的值是否在精度范围允许内,如果在的话直接retur

通过刷新来实现自适应

前言:领导要求我实现自适应,前期前端框架的搭建也没我,一开始项目也没考虑这个,就因为老总说了一句,领导就要求实现,唉... 自适应可以通过刷新来实现:绑定window.onresize函数,函数中计算所要刷新的某个模块需要的高度和宽度,然后刷新iframe. iframe的几种刷新方法(网上找的): 方案一:用iframe的name属性定位<input type="button" name="Button" value="Button" o

TCP(一)

传输控制协议TCP特点:1,面向连接的运输层协议        2,每一条TCP只能有两个端点.点对点        3,TCP是可靠的,无差错,不重复,顺序到达.        4,全双工,允许通信双方进程在任何时候都能收发数据.        5,面向字节流.无结构字节流. TCP连接每一条TCP连接的两端是套接字.套接字的格式:IP地址:端口号 理想传输的特点:传输信道不产生差错,不管发送方以多块的速度发送数据,接收方总来得及处理. 停止等待协议 停止等待就是每发送完一个分组就停止发送,等

bzoj-2178 圆的面积并

题意: 给出平面上的n个圆,求它们的面积并: n<=1000: 题解: 这题似乎有很多种姿势来解,我学了一种比较Simple的: 对于三次以下多项式函数的定积分,有一个Simpson公式: ∫[l,r]f(x)=(r-l)(f(l)+f(r)+4f(mid))/6 公式可以利用导数证明,但是对于三次以上或者其他函数是不成立的: 比如圆的参数方程,三角函数之类的奇怪东西: 虽说如此,不成立的时候,也可以利用这个公式来干点什么.. 利用这个公式来拟合曲线! 对于一段区间[l,r],我们求得f(l),

计算几何 val.3

目录 计算几何 val.3 自适应辛普森法 定积分 引入 辛普森公式 处理精度 代码实现 模板 时间复杂度 练习 闵可夫斯基和 Pick定理 结论 例题 后记 计算几何 val.3 自适应辛普森法 可以用来求多边形的面积并(圆也行) 定积分 定积分的几何意义是函数的曲线上 \(x\) 的一段区间与 \(x\) 轴围成的曲边梯形的带符号面积 表示法为 \[ \int_{a}^{b} f(x) \mathrm{d} x \] 引入 计算方法: 分成一堆小区间 \[ \int_{a}^{b} f(x)

uva 1356 - Bridge(积分+二分)

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

BZOJ 2178: 圆的面积并 [辛普森积分 区间并]

2178: 圆的面积并 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1740  Solved: 450[Submit][Status][Discuss] Description 给出N个圆,求其面积并 Input 先给一个数字N ,N< = 1000 接下来是N行是圆的圆心,半径,其绝对值均为小于1000的整数 Output 面积并,保留三位小数 太可怕了!!!!!! 直接上辛普森积分 函数值就是x=..线上的区间并 区间并直接排序扫描就可以了