博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 1905 Expanding Rods 二分答案
阅读量:5366 次
发布时间:2019-06-15

本文共 1041 字,大约阅读时间需要 3 分钟。

题目地址: 

思路: 

列出方程 2*R*x=L‘

                 2*R*sin(x)=L

                两式相除即得 x/sin(x)  = 1+n*c    前提x!=0   就是 n*c>0  

               答案就是 L/2* (1/sin(x)-1/tan(x))       三角函数化简为 L/2*tan(x/2)   x  在0~ PI/2   于是关于x是单增的, 反函数也是单增的,x/sin(x) 也是单增的

一开始的思路是先用 二分把 x/sin(x)  = 1+n*c  里面的x解出来,然后带进 L/2*tan(x/2) 计算  虽然样例过了,但是还是wa,看来是精度问题。

所以直接二分答案,ans= L/2*tan(x/2)    =>  x=2*arctan(ans*2/L)  这个关于ans是单增的,带进 x/sin(x)  也是单增的 可以二分了  

代码:

#include
#include
#include
const long double PI=acos(-1.0);long double L,n,c;long double f(long double x){ double xx=2*atan(2*x/L); return xx/sin(xx);}using namespace std;int main(){ long double l,r,mid; while(cin>>L>>n>>c) { if(L==-1) break; l=0; //r=PI/2; r=L; double ans; if(n*c>0) { while(r-l>1e-4) { mid=(l+r)/2; if(f(mid)>1+n*c) r=mid; else l=mid; } //ans=1.0/sin(l)-1.0/tan(l); ans=l; } else ans=0; printf("%.3lf\n",ans); }}

    

转载于:https://www.cnblogs.com/jingqi814/p/3581548.html

你可能感兴趣的文章
竞价广告系统-位置拍卖理论
查看>>
策略模式 C#
查看>>
[模板]树状数组
查看>>
[HDU 6447][2018CCPC网络选拔赛 1010][YJJ's Salesman][离散化+线段树+DP]
查看>>
设计模式学习的好方法
查看>>
感谢Leslie Ma
查看>>
几种排序方法
查看>>
查看数据库各表的信息
查看>>
第一阶段测试题
查看>>
第二轮冲刺第五天
查看>>
图片压缩
查看>>
Hadoop-2.6.5安装
查看>>
ES6思维导图
查看>>
第四周作业
查看>>
20151121
查看>>
线段重叠 (思维好题)
查看>>
Codeforces Round #413 C. Fountains (线段树的创建、查询、更新)
查看>>
SBuild 0.1.5 发布,基于 Scala 的构建系统
查看>>
WordPress 3.5 RC3 发布
查看>>
DOM扩展札记
查看>>