POJ 3737 三分
2017-07-24 17:33
281 查看
题意
给一个圆锥的表面积,问体积最大是多少题解
s=pi*r*l+pi*r*rv=pi*r*r*h/3
三分搜索r,下界设为0,上界设为sqrt(s/2/pi)(这么设置上界的原因是假设r=l,则r=sqrt(s/2/pi),但实际上由于r=sqrt(l*l-h*h),因此完全可以作为上界)。此外,在计算的时候,还用到了一个小技巧,PI可以用acos((double)(-1))来表示,如果用3.14来表示的话,存在精度不足的情况。
代码
#include <iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<vector> #include<cmath> #include<queue> #include<string> #include<set> #include<map> #include<bitset> #define UP(i,l,h) for(int i=l;i<h;i++) #define DOWN(i,h,l) for(int i=h-1;i>=l;i--) #define W(a) while(a) #define INF 0x3f3f3f3f #define LL long long #define MAXN 1010 #define EPS 1e-10 #define PI acos(double(-1)) using namespace std; double s; double getv(double r){ double l=s/PI/r-r; double h=sqrt(l*l-r*r); double v=PI*r*r*h/3; return v; } double gethigh(double r){ double l=s/PI/r-r; double h=sqrt(l*l-r*r); return h; } int main() { W(~scanf("%lf",&s)){ double low=0,high=sqrt(s/2/PI); W(high-low>EPS){ double mid=(low+high)/2; double mmid=(mid+high)/2; if(getv(mid)>getv(mmid)){ high=mmid; }else{ low=mid; } } printf("%.2f\n",getv(low)); printf("%.2f\n",gethigh(low)); printf("%.2f\n",low); } return 0; }
相关文章推荐
- poj 3737 UmBasketella 三分
- poj3737 UmBasketella(三分)
- poj 3737 UmBasketella(数学推导||三分)
- POJ - 3737 - UmBasketella(三分)
- POJ 3737 UmBasketella 三分或公式
- POJ 3737 UmBasketella 三分搜索
- poj 3737 UmBasketella(三分)
- [POJ 3737][三分]UmBasketella
- POJ 3737 UmBasketella (三分算法)
- POJ 3737 UmBasketella(三分)
- poj 3737 UmBasketella(三分+求导)
- poj 3737 UmBasketella (三分)
- POJ 3737 UmBasketella(三分)
- POJ 3737 UmBasketella(三分模板)
- POJ 3737 UmBasketella(三分)
- [POJ 3737]UmBasketella(三分)
- poj 3301 Texas Trip (三分求极值)
- 三分 --- POJ 3301 Texas Trip
- POJ 3737(UmBasketella)
- poj 3301 Texas Trip (三分)