题意:
一根棍子,受热后长度会改变。L' = (1+n*C)*L
问你受热后棍子的中点距离地面的高度h为多少。
思路:
推公式,
L' = p*r ——p为弧度
r = (L/2)/sin(p/2)
两式联立,二分p即可。
AC代码:
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <iostream>
#include <iomanip>
using namespace std;
const double PI = acos(-1.0);
double l, n, c;
double tl;
bool OK(double mid)
{
double tmp = mid/sin(mid/2);
if(tmp > tl) return false;
return true;
}
int main()
{
ios::sync_with_stdio(false);
int t,cas = 0;
cin>>t;
while(t--)
{
cin>>l>>n>>c;
tl = 2*l*(1+n*c)/l;
double L = 0, R = PI;
while(R - L > 1e-8)
{
double mid = (L+R)/2;
if(OK(mid))
L = mid;
else
R = mid;
}
double l2 = l*(1+n*c);
double h = l2/L*(1-cos(L/2));
cout<<"Case "<<++cas<<": "<<fixed<<setprecision(6)<<h<<endl;
}
return 0;
}