题意:给你一个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;
}