您的位置:首页 > 其它

POJ 1905 Expanding Rods 二分加数学公式的推导

2016-02-24 20:55 519 查看
点击打开链接

题意:给你一个L长的细棒然后将他卡在两个板子之间进行加热 ,然后他会变成长度为

S=L*(1+n*c)的弧线棒 求出该弧线棒的中心比以前高出多少(H)

思路:

已知 图可得 :

R 为圆弧的半径 S为弧长 θ为弧度角 为半个弧长对应的角度大小

H 为高出的长度

①R^2-L^2/4=(R-H)^2

②sinθ=L/2R;

③θ=S/2R;

=>有①得到 R=H/2+L*L/(8*H);

由②③得到 S=2*R*asin(L/(2*R));

二分枚举H 可得到R 然后带入公式 得到S1

判断S 是否等于S1 即可

SH:可以通过推导出公式来然后二分枚举公式右边的变量即可得到左边值

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<set>
#define PI acos(-1)
#define eps 0.00000001
using namespace std;
int main()
{
double L,n,c;
while(~scanf("%lf%lf%lf",&L,&n,&c))
{
if(L<0&&n<0&&c<0)
break;
double sum=L*(1+n*c);
double low=0,high=sum;
double mid,Max=0;
while(low<high)     ///等价于low+eps<=high
{
mid=(low+high)/2;
/// cout<<mid;
double R=mid/2+L*L/(8*mid);
double S=2*R*asin(L/(2*R));
if(sum==S)
break;
if(sum>S)
low=mid;
else
high=mid;
}
printf("%.3f\n",mid);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: