diff --git a/HDOJ/3264_hcbbt.cpp b/HDOJ/3264_hcbbt.cpp new file mode 100644 index 0000000..e3eac8b --- /dev/null +++ b/HDOJ/3264_hcbbt.cpp @@ -0,0 +1,90 @@ +/* +* Author: illuz +* Blog: http://blog.csdn.net/hcbbt +* File: 3264.cpp +* Create Date: 2014-08-12 20:25:57 +* Descripton: Geometry, the insection of two round, binary +*/ + +#include +#include +#include +#include +#include +using namespace std; +#define repf(i,a,b) for(int i=(a);i<=(b);i++) + +typedef long long ll; + +const int N = 21; +const double PI = acos(-1.0); +const double EPS = 1e-8; + +int t, n; + +struct Round { + double x, y; + double r; +} r[N], ori; + +double dis(const Round &a, const Round &b) { + return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); +} + +double insection_of_rounds(Round &a, Round &b) { + double d = dis(a, b); + if (d >= a.r + b.r) + return 0; + if (d <= fabs(a.r - b.r)) { + double r = a.r < b.r ? a.r : b.r; + return PI * r * r; + } + double ang1 = acos((a.r * a.r + d * d - b.r * b.r) / 2. / a.r / d); + double ang2 = acos((b.r * b.r + d * d - a.r * a.r) / 2. / b.r / d); + double ret = ang1 * a.r * a.r + ang2 * b.r * b.r - d * a.r * sin(ang1); + return ret; +} + +bool check(Round& ori) { + repf (i, 0, n - 1) { + if (insection_of_rounds(ori, r[i]) * 2 < PI * r[i].r * r[i].r) + return false; + } + return true; +}; + +double bin(double l, double r, Round& ori) { + double mid; + while (fabs(l - r) >= EPS) { + mid = (l + r) / 2; + ori.r = mid; + if (check(ori)) { + r = mid; + } else { + l = mid + EPS; + } + } + return mid; +} + +int main() { + scanf("%d", &t); + while (t--) { + scanf("%d", &n); + repf (i, 0, n - 1) { + scanf("%lf%lf%lf", &r[i].x, &r[i].y, &r[i].r); + } + double ans = 1e10; + repf (i, 0, n - 1) { + ori.x = r[i].x; + ori.y = r[i].y; + double right = 0; + repf (j, 0, n - 1) { + right = max(right, dis(ori, r[j]) + r[j].r); + } + ans = min(ans, bin(0, right, ori)); + } + printf("%.4f\n", ans); + } + return 0; +}