poj 1905 Expanding Rods (数学 计算方法 二分)

题目链接

题意:将长度为L的棒子卡在墙壁之间。现在因为某种原因,木棒变长了,因为还在墙壁之间,所以弯成了一个弧度,现在求的是弧的最高处与木棒原先的地方的最大距离。

分析:

下面的分析是网上别人的分析:

设弦长为L0(即原长),弧长为L1=(1+n*C)*l0,目标值为h,半径为R,弧所对圆心角为2θ(弧度制)。
可以得到以下方程组:
圆的弧长公式:L1=2θR
三角函数公式:L0=2*R*sinθ,变换得θ=arcsin(L0/(2*R))
勾股定理:R^2=(R-h)^2+(0.5*L0)^2,变换得L0^2+4*h^2=8*h*R
合并①②式得到
L1=2*R*arcsin(L0/(2*R))
半径R可以由③式变换得到
R=(L0^2+4*h^2)/(8*h)
可以用二分枚举h的值,计算出R和L1,与题目中L1进行比较。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <cstdio>
 6 #include <vector>
 7 #include <algorithm>
 8 #define LL long long
 9 using namespace std;
10 const double eps = 1e-8;
11
12 int main()
13 {
14     double l0, n, c, l1, l2, r;
15     double high, low, mid;
16     while(cin>>l0>>n>>c)
17     {
18         if(l0==-1&&n==-1&&c==-1) break;
19         l1 = (1+n*c)*l0;
20         low = 0; high = 0.5*l0;
21         while(high-low>eps)
22         {
23             mid = (low+high)/2;
24             r = (l0*l0 + 4*mid*mid)/(8*mid);
25             l2 = 2*r*asin(l0/(2*r));
26             if(l1 < l2) high = mid;
27             else low = mid;
28         }
29         mid = (low+high)/2;
30         printf("%.3lf\n", mid);
31     }
32     return 0;
33 }

poj 1905 Expanding Rods (数学 计算方法 二分),布布扣,bubuko.com

时间: 2024-10-05 19:24:18

poj 1905 Expanding Rods (数学 计算方法 二分)的相关文章

POJ 1905 Expanding Rods 浮点数二分

Expanding Rods Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 11145   Accepted: 2879 Description When a thin rod of length L is heated n degrees, it expands to a new length L'=(1+n*C)*L, where C is the coefficient of heat expansion. Whe

poj 1905 Expanding Rods(木杆的膨胀)【数学计算+二分枚举】

Expanding Rods Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 13516   Accepted: 3484 Description When a thin rod of length L is heated n degrees, it expands to a new length L'=(1+n*C)*L, where C is the coefficient of heat expansion. Whe

POJ 1905 Expanding Rods (二分+计算几何+精度处理)

题目地址:POJ 1905 用二分枚举h,然后判断弧长是否符合条件.重点还是在精度问题上,具体看代码吧.. #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib.h> #include <map> #include <set> #includ

POJ 1905 Expanding Rods

Expanding Rods Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 12796   Accepted: 3299 Description When a thin rod of length L is heated n degrees, it expands to a new length L'=(1+n*C)*L, where C is the coefficient of heat expansion. Whe

POJ 1905 Expanding Rods#二分

http://poj.org/problem?id=1905 题意:将一条直线变成一条弧线(该弧线是圆的一部分),求中心位置发生的位移. 由于精度需要控制好,所以选择用圆半径作为二分的目标,l=0,r=INF,LL为弧线长度,根据半径mid以及弦长L,可以求出对应的弧线长度t=2*asin(0.5*L/mid)*mid,再与LL比较,若t<LL,说明半径取大了,故r=mid,继续二分. #include<iostream> #include<cstdio> #include&

poj 1905 Expanding Rods 二分解方程

题意: 中已知L,S解h. 分析: 两个方程两个未知数,理论是可解的.解起来有困难,可用二分的方法. 代码: #include <iostream> #include <cmath> using namespace std; int main() { double l,n,c,s,r; while(scanf("%lf%lf%lf",&l,&n,&c)==3){ if(l<0) break; double mid,low=0.0,h

UVA 10668 - Expanding Rods(数学+二分)

UVA 10668 - Expanding Rods 题目链接 题意:给定一个铁棒,如图中加热会变成一段圆弧,长度为L′=(1+nc)l,问这时和原来位置的高度之差 思路:画一下图可以很容易推出公式,设圆弧扇形部弧度r,那么可以计算出铁棒长度为lr/sin(r)这个公式在[0, pi/2]是单调递增的,所以可以用二分法去求解 要注意的一点是最后答案计算过程中带入mid,之前是带入x(二分的左边值),可实际上x是可能等于0的,而带入mid,由于是double型,所以mid实际上表示是一个非常趋近0

POJ1905 expanding rods 【水二分+谜之WA】

一道很水的题,就是不知道为什么wa,,, 其实小优那个精度控制循环控制二分的方法不算好,如果esp太小,会TLE,直接人工控制次数最好了 #include <cstdio> #include <cmath> #include <iostream> using namespace std; double getres(double r,double s,double l) { //cout<<(r-s/acos(1-l*l/(2.0*r*r)))<<

POJ 题目1905 Expanding Rods(二分,数学几何)

Expanding Rods Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 12827   Accepted: 3311 Description When a thin rod of length L is heated n degrees, it expands to a new length L'=(1+n*C)*L, where C is the coefficient of heat expansion. Whe