poj3737 UmBasketella 真正的三分
之前用二分写三分的板子。。。现在正式写一个三分,但是也不难,就是把区间分为三段就行了。求二次函数的峰值,每次取大的区间就行了。
题干:
最近几天,人们总是设计出多功能的新东西。例如,您不仅可以使用手机给朋友打电话,还可以使用手机拍照或听MP3。另一个例子是手表和电视的结合。这些多功能项目总能改善人们的日常生活,深受用户青睐。 Umbrella公司最近为彩虹城的人们发明了一种新型伞“UmBasketella”,它的想法也来自于这种多功能 - 伞和日用品的组合。这种伞可以用作篮子,你可以放入你想要携带的东西。由于彩虹城经常下雨,这种创新用途是成功的,“UmBasketella”卖得很好。不幸的是,最初的“UmBasketella”没有自动音量控制技术,因此当用户试图在其中放入太多东西时很容易损坏。要解决这个问题,您需要设计一个具有最大音量的“UmBasketella”。假设“UmBasketella”是一个锥形容器,其表面区域(包括底部)是已知的, 输入 输入包含几个测试用例。Eash案例仅包含一个实数S,表示锥体的表面积。这是保证1≤ 小号 ≤10000。 产量 对于每个测试用例,输出应包含三行。 第一行应该有一个实数表示锥体的最大体积。 输出第二条线上锥体的高度和第三条线上锥体底部区域的半径。 所有实数都应该舍入到0.01。 样本输入 三十 样本输出 10.93 4.37 1.55 资源
代码:
#include<iostream> #include<cstdio> #include<cmath> #include<ctime> #include<queue> #include<algorithm> #include<cstring> using namespace std; #define duke(i,a,n) for(int i = a;i <= n;i++) #define lv(i,a,n) for(int i = a;i >= n;i--) #define clean(a) memset(a,0,sizeof(a)) const int INF = 1 << 30; typedef long long ll; typedef double db; template <class T> void read(T &x) { char c; bool op = 0; while(c = getchar(), c < '0' || c > '9') if(c == '-') op = 1; x = c - '0'; while(c = getchar(), c >= '0' && c <= '9') x = x * 10 + c - '0'; if(op) x = -x; } template <class T> void write(T x) { if(x < 0) putchar('-'), x = -x; if(x >= 10) write(x / 10); putchar('0' + x % 10); } db s,pi = acos(-1.0); inline db calc(const db &r) { db l = (s - r * r) / r; db h = sqrt(l * l - r * r); db v = pi * r * r * h / 3.0; return v; } int main() { while(scanf("%lf",&s) != EOF) { s /= pi; db lft = 0,rgt = sqrt(s),m1,m2,r; duke(t,0,200) { m1 = lft + (rgt - lft) / 3.0; m2 = rgt - (rgt - lft) / 3.0; if(calc(m1) <= calc(m2)) lft = m1,r = m2; else rgt = m2,r = m1; } db l = (s - r * r) / r; db h = sqrt(l * l - r * r); db v = pi * r * r * h / 3.0; printf("%.2f\n%.2f\n%.2f\n",v,h,r); } return 0; }
只想找一个不会伤害我的人