UVa 1473 Dome of Circus(求凸包)

来源:互联网 发布:百度网络推广专员 编辑:程序博客网 时间:2024/05/03 23:03

暂存。WA

#include <iostream>#include <stdlib.h>#include <stdio.h>#include <math.h>#include <algorithm>#define INF 0x7f7f7f7fusing namespace std;const double eps = 1e-8;const double pi = acos(-1.0);const int maxn = 10010;int sig(double argu){return (argu > eps) - (argu < -eps);}typedef struct Point{double x, y;Point (double _x = 0.0, double _y = 0.0):x(_x), y(_y) {}Point operator +(const Point &argu) const{return Point(x + argu.x, y + argu.y);}Point operator -(const Point &argu) const{return Point(x - argu.x, y - argu.y);}Point operator *(const double k) const{return Point(x * k, y * k);}Point operator /(const double k) const{return Point(x / k, y / k);}double operator ^(const Point &argu) const{return (x * argu.y - y * argu.x);}bool operator <(const Point &argu) const{if(sig(y - argu.y) == 0)return x < argu.x;elsereturn y < argu.y;}}Vector;int n;Point pp[maxn], minp;double x, y, z;int q[maxn], top;double h, r;double s[maxn], best;int id;bool cmp(Point a, Point b){double anga = atan2(a.y - minp.y, a.x - minp.x);double angb = atan2(b.y - minp.y, b.x - minp.x);return anga < angb;}double Cross(Point a, Point b, Point c){return ((b - c) ^ (a - c));}void GetHull(){for(int i = 2; i < n; i++){while(top > 1 && Cross(pp[i], pp[q[top - 1]], pp[q[top - 2]]) < 0)top--;q[top++] = i;}}void GetBV(int id){if(id == 0){best = pi * (1.5 * pp[0].x) * (1.5 * pp[0].x) * pp[0].y;h = 3.0 * pp[0].y;r = 1.5 * pp[0].x;}else if(id == 1){if(best < pi * (1.5 * pp[q[1]].x) * (1.5 * pp[q[1]].x) * pp[q[1]].y){best = pi * (1.5 * pp[q[1]].x) * (1.5 * pp[q[1]].x) * pp[q[1]].y;h = 3.0 * pp[q[1]].y;r = 1.5 * pp[q[1]].x;}}else{double k = atan2(2 * pp[q[id]].y, -pp[q[id]].x);double kl = atan2(pp[q[id]].y - pp[q[id - 1]].y, pp[q[id]].x - pp[q[id - 1]].x);double kr = atan2(pp[q[id + 1]].y - pp[q[id]].y, pp[q[id + 1]].x - pp[q[id]].x);if(sig(kr - pi) >= 0 && sig(k - kr) >= 0)k = kr;if(sig(kl - pi) >= 0 && sig(kl - k) >= 0)k = kl;double tmph = x * tan(k) + y;double tmpr = x * y / tan(k);double tmpv = pi * (1.5 * tmpr) * (1.5 * tmpr) * tmph;if(best < tmpv){best = tmpv;h = tmph;r = tmpr;}}}int main(){//freopen("1473.in", "r", stdin);while(~scanf("%d", &n)){for(int i = 0; i < n; i++){scanf("%lf%lf%lf", &x, &y, &z);pp[i] = Point(sqrt(x * x + y * y), z);}minp = pp[0];for(int i = 1; i < n; i++)minp = min(minp, pp[i]);sort(pp, pp + n, cmp);q[0] = 0;top = 1;GetBV(0);if(n > 1){q[1] = 1;top++;GetBV(1);if(n > 2){GetHull();for(int i = 0; i < top; i++){double base = (pp[q[i]].x - pp[q[(i + 1) % top]].x);if(sig(base) != 0){double slope = (pp[q[i]].y - pp[q[(i + 1) % top]].y) / base;if(slope < 0.0)GetBV(i);}}}}printf("%.3lf %.3lf\n", h, r);}return 0;}


0 0
原创粉丝点击