题意
我不会我看题解做的我好卑微
- coefficient - 系数
chord - 弦
displayed - 置换 - 原长度L,加热n度膨胀后新长度L’=(1+n*C)*L,C是热膨胀系数,膨胀后是圆弧,计算弓高。
L’ 上限为1.5L - 输入多行:L,n,C
- 输出弓高,保留三位小数
思路
- s = 2ar = 2r*asin(L/(2r))
r2 = (r-d)2 + L2/4
化简得 r = d/2 + L2/(8d)
d,r未知 - 二分法列举d,弦固定弓高越高弧越长,即d越大s越大
把d带入求r,计算s,将s与L’=(1+n*c)*L比较,当s大时d取左区间,否则右区间 - d最小为0(没有膨胀的时候),当 r = L/2 时d最大(膨胀到半圆的时候)为L/2
此时的L’ = πr = π/2*L > 1.5L,题意L’不会比1.5L大,所以这里d=L/2一定比题意最大的d大,可以用来做d的上限。 - 输出保留三位小数,把right - left < 0.00001作结束条件
笔记
- 1e-5,e前后都要有数字,后必须是整数
- 弧长=角度×半径
- 比较条件模棱两可的浮点计算,请不要吝啬你的>=和<=,AC和WA仅一步之遥啊哭
不想说了具体见代码
代码
#include<cstdio>
#include<math.h>
const double esp=1e-5;
int main(){
double L, n, C, r, d, s;
double left, right;
while(scanf("%lf%lf%lf",&L,&n,&C)!=EOF){
if(L<0 && n<0 && C<0)
break;
left = 0.0;
right = 0.5*L;
s = (1+n*C)*L;
while(right-left>esp){
d = (left+right)/2;
r = d/2 + L*L/8/d;
if(s<2*r*asin(L/(2*r))) //注意这里是WA的,换成<=以后可以AC
right = d;
else
left = d;
/*
if(s>2*r*asin(L/(2*r))) //这里也可以AC,你自己品一下
left = d;
else
right = d;
*/
}
printf("%.3f\n", d);
}
return 0;
}