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:可以通过推导出公式来然后二分枚举公式右边的变量即可得到左边值
题意:给你一个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; }
相关文章推荐
- hdu3487 splay树
- Java中几种数据类型的转化
- CC2650之SensorTag 演示
- 孤儿进程和僵尸进程
- Case when 的使用方法
- 第三次作业
- 51单片机系列知识10--串行通信(1)
- 微信公众号的开发之 回复用户消息和事件响应(四)
- web.xml is missing and <failOnMissingWebXml> is set to true
- SVN分支一些操作
- 3、使用Java api 和 jni混合方式调用OpenCV
- matlab 随笔
- 海康SDK编程指南(C#二次开发版本)
- 【poj3233】Matrix Power Series(递推+矩阵快速幂)
- Yii2-权限控制RBAC-理论篇(一)
- I/O复用
- ApplicationResources
- Experimental Educational Round: VolBIT Formulas Blitz J
- 学习linux计划书
- iOS-UI-基本控件之UISwitch