poj_1905

来源:互联网 发布:snmp代理软件 编辑:程序博客网 时间:2024/06/05 13:22

源地址:http://poj.org/problem?id=1905

题目大意就是求一条路受热弯曲以后,膨胀起来的高度。



就是求图中?的地方。

我们假设图中?的地方高度为h,原路长为L,



通过上面这幅图,我们可以计算得出

r = (L*L+4*h*h)/(8*h)----------1

2*r*arcsin(L/2r)=S-----------2

我们要求的是h,对于h,我们可以用二分的方法来计算得到。

题目中说弯曲以后的长度不会超过原长度的1/2,其实具体来算h的上限是不容易的,我们假设h=1/2L,则此时S=π/2*L,是大于题目中所说的 3/2L,所以我们就把h的上限设为1/2*L,下限的话设为0.

然后每计算得到一个h,我们就计算r,然后带入2式,得到一个S,这个S再和 L‘ = (1+n*c)*L来比较,如果偏小了,那么说明h也偏小,此时改变左边界,否则改变右边界。

#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include<time.h>#include<queue>#include<stack>#include<iterator>#include<math.h>#include<stdlib.h>#include<limits.h>#include<set>#include<map>//#define ONLINE_JUDGE#define eps 1e-5#define INF 0x7fffffff#define FOR(i,a) for((i)=0;i<(a);(i)++)#define MEM(a) (memset((a),0,sizeof(a)))#define sfs(a) scanf("%s",a)#define sf(a) scanf("%d",&a)#define sfI(a) scanf("%I64d",&a)#define pf(a) printf("%d\n",a)#define pfI(a) printf("%I64d\n",a)#define pfs(a) printf("%s\n",a)#define sfd(a,b) scanf("%d%d",&a,&b)#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c)#define for1(i,a,b) for(int i=(a);i<b;i++)#define for2(i,a,b) for(int i=(a);i<=b;i++)#define for3(i,a,b)for(int i=(b);i>=a;i--)#define MEM1(a) memset(a,0,sizeof(a))#define MEM2(a) memset(a,-1,sizeof(a))const double PI=acos(-1.0);template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}template<class T> inline T Min(T a,T b){return a<b?a:b;}template<class T> inline T Max(T a,T b){return a>b?a:b;}using namespace std;#define ll __int64#define pi acos(-1.0);//int n,m;#define Mod 1000000007#define N 510#define M 1000100const int size = 10010;const int mod = 9901;ll dis1[100010];double length;//bool Check(ll mindis){//}int main(){#ifndef ONLINE_JUDGE    freopen("in.txt","r",stdin);//  freopen("out.txt","w",stdout);#endif    double L,n,c;    while(scanf("%lf%lf%lf",&L,&n,&c)!=EOF){    if(L<0 && n<0 && c<0) break;    length = (1+n*c)*L;    double l = 0;    double r = L/2;    double mid;    while(r-l>eps){     mid = (l+r)/2;    double rr = (L*L+4*mid*mid)/(8*mid);    double s = 2*rr*asin(L/(2*rr));    if(s<length)    l = mid;    else    r = mid;    }    printf("%.3f\n",mid);    }return 0;}


0 0