本文主要是介绍lightoj 1137 Expanding Rods | 二分+几何,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意:
一根棍子,受热后长度会改变。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;
- }
这篇关于lightoj 1137 Expanding Rods | 二分+几何的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!