您的位置:首页 > 其它

UVA 1473 - Dome of Circus(三分+计算几何)

2015-03-26 15:28 330 查看
这题先推下公式,很容易发现圆锥的体积和半径满足一个二次函数,所以可以用三分

于是三分半径即可

代码:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

const int N = 10005;
const double PI = acos(-1.0);

struct Point {
double x, y, z;
void read() {
scanf("%lf%lf%lf", &x, &y, &z);
}
} p
;

int n;

double gao(double r) {
double h = 0;
for (int i = 0; i < n; i++) {
double d = sqrt(p[i].x * p[i].x + p[i].y * p[i].y);
h = max(h, p[i].z / (r - d) * r);
}
return h;
}

int main() {
while (~scanf("%d", &n)) {
double l = 0, r = 1e20;
for (int i = 0; i < n; i++) {
p[i].read();
l = max(l, sqrt(p[i].x * p[i].x + p[i].y * p[i].y));
}
l += 1e-8;
for (int i = 0; i < 200; i++) {
double midl = (l * 2 + r) / 3;
double midr = (l + r * 2) / 3;
double h1 = gao(midl);
double h2 = gao(midr);
double s1 = PI * midl / 3 * midl * h1;
double s2 = PI * midr / 3 * midr * h2;
if (s1 > s2) l = midl;
else r = midr;
}
printf("%.3f %.3f\n", gao(l), l);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: