题面

传送门

分析



如图:已知AB=L,弧AB=L(1+nC)" role="presentation" style="position: relative;">AB=L,弧AB=L(1+nC)AB=L,弧AB=L(1+nC),M为AB中点,N为圆上一点,且ON垂直于AB于M,求MN

设半径为R" role="presentation" style="position: relative;">RR,∠AOM=θ" role="presentation" style="position: relative;">∠AOM=θ∠AOM=θ(弧度),MN=x" role="presentation" style="position: relative;">MN=xMN=x

则可列出方程组

{2Rθ=L(1+nc)(1)Rsin⁡θ=L2(2)x=R(1−cos⁡θ)(3)" role="presentation" style="position: relative;">⎧⎩⎨⎪⎪⎪⎪2Rθ=L(1+nc)(1)Rsinθ=L2(2)x=R(1−cosθ)(3){2Rθ=L(1+nc)(1)Rsin⁡θ=L2(2)x=R(1−cos⁡θ)(3)

若求出θ" role="presentation" style="position: relative;">θθ便可以求出x,所以我们从 θ" role="presentation" style="position: relative;">θθ入手,尝试解上面的方程组

由(1)(2)式得 θsin⁡θ=1+nC" role="presentation" style="position: relative;">θsinθ=1+nCθsin⁡θ=1+nC

本人数学不好,求不出上面的方程的解析解(如果有解析解可以在评论中指出)

于是采用二分的方法来近似求根

显然0&lt;θ≤π2" role="presentation" style="position: relative;">0<θ≤π20<θ≤π2

由图知θ" role="presentation" style="position: relative;">θθ越大,1+nC越大" role="presentation" style="position: relative;">1+nC越大1+nC越大

我们二分θ" role="presentation" style="position: relative;">θθ,设二分中点为mid,端点为[L,R]并计算midsin⁡mid" role="presentation" style="position: relative;">midsinmidmidsin⁡mid,若midsin⁡mid&gt;1+nC" role="presentation" style="position: relative;">midsinmid>1+nCmidsin⁡mid>1+nC,则寻找更小的,R=mid.否则寻找更大的,L=mid

还有几个细节:

1.π" role="presentation" style="position: relative;">ππ一定要很精确,否则会WA

2.设定的二分误差要尽量小

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define eps 1e-11
#define pi 3.141592653589793
using namespace std;
double L,n,C,theta,x;
int main(){
while(scanf("%lf %lf %lf",&L,&n,&C)!=EOF){
if(L==n&&n==C&&C==-1) break;
if(n*C==0){
printf("0.000\n");
continue;
}
double l=eps,r=pi/2;//用弧度表示角
while(fabs(l-r)>eps){
double mid=(l+r)/2;
double hu=mid/sin(mid);
if(hu>1+n*C) r=mid;
else l=mid;
}
theta=l;
double R=L/(2*sin(theta));
printf("%.3f\n",R*(1-cos(theta)));
}
}

最新文章

  1. 修改Firefox的User-Agent,伪装修改秘籍
  2. android 三步实现沉浸式 简单到无法想象
  3. Mysql快速删除表中重复的数据
  4. 记录工作中用到的linux命令
  5. [CF225C] Barcode (简单DAG上dp)
  6. NSString的八条实用技巧
  7. POJ1423 - Big Number(Stirling公式)
  8. vsftpd 访问 权限控制
  9. C++ 的多重继承
  10. CoreData和FMDB你用哪个?
  11. 提高java编程质量 - (四)i++ 和 ++i 探究原理
  12. 【Tomcat】重新獲得war包
  13. mybatis insert 返回主键
  14. 向Spring容器中注册组件的方法汇总小结
  15. Spring集成JUnit单元测试框架
  16. Yii验证码简单使用及
  17. KiCad 的 Digikey 元件库
  18. Linux RPS/RFS 实现原理浅析
  19. 一个简单的Java程序
  20. PHP代码审计笔记--SQL注入

热门文章

  1. 28.密码学知识-hash函数-5——2019年12月19日
  2. layui js动态添加的面板不能折叠
  3. for循环性能测试
  4. 【leetcode】523. Continuous Subarray Sum
  5. Linux学习-samba服务
  6. select标签的下拉框为图片的插件
  7. Presenter 层
  8. window下启动redis服务
  9. xml基础之二(XML结构【2】)DTD文档模版
  10. loj#6036 编码