Bzoj1336 Bzoj1337 最小圆覆盖
来源:互联网 发布:java中文本框取值 编辑:程序博客网 时间:2024/05/16 13:44
题意简述:
给出
题解:
http://blog.csdn.net/acm_cxlove/article/details/7887305(不能写得更好)
吐槽:老年选手算两直线交点叉积两边元素放反调死了才调出来
#include<bits/stdc++.h>const int N = 1e5 + 10;const double eps = 1e-12;const double Pi = acos(-1);struct P { double x, y; P() {} P(double _x, double _y): x(_x), y(_y) {}};double sqr(double x) {return x * x;}P operator + (const P &a, const P &b) {return P(a.x + b.x, a.y + b.y);}P operator - (const P &a, const P &b) {return P(a.x - b.x, a.y - b.y);}P operator * (const P &a, double base) {return P(a.x * base, a.y * base);};double operator * (const P &a, const P &b) {return a.x * b.y - b.x * a.y;}double dot(const P &a, const P &b) {return a.x * b.x + a.y * b.y;}double dis(const P &a, const P &b) {return sqrt(sqr(a.x - b.x) + sqr(a.y - b.y));};P mid(const P &a, const P &b) {return P((a.x + b.x) * 0.5, (a.y + b.y) * 0.5);};P rotate(const P &p, double alpha) {return P(cos(alpha) * p.x - sin(alpha) * p.y, sin(alpha) * p.x + cos(alpha) * p.y);}struct L { P p, v; L() {} L(P _p, P _v): p(_p), v(_v) {}};P cross(const L &a, const L &b) {return a.p + a.v * (b.v * (a.p - b.p) / (a.v * b.v));}struct C { P o; double r; C() {} C(P _o, double _r): o(_o), r(_r) {}};C get(const P &a, const P &b) {return C(mid(a, b), dis(a, b) * 0.5);}C get(const P &a, const P &b, const P &c) { if (abs((b - a) * (c - a)) < eps) { double d1 = dis(a, b), d2 = dis(b, c), d3 = dis(c, a); if (d1 > d2 && d1 > d3) return get(a, b); if (d2 > d3) return get(b, c); else return get(c, a); }; P t1 = rotate(c - a, Pi / 2), t2 = rotate(c - b, Pi / 2); P o = cross(L(mid(a, c), rotate(c - a, Pi / 2)), L(mid(b, c), rotate(c - b, Pi / 2))); return C(o, dis(o, c));}bool inclr(const P &p, const C &o) {return dis(o.o, p) < o.r + eps;}int n;P p[N];int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%lf%lf", &p[i].x, &p[i].y); std::random_shuffle(p + 1, p + n + 1); C ans = C(p[1], 0); for (int i = 2; i <= n; i++){ if (inclr(p[i], ans)) continue; ans = C(p[i], 0); for (int j = 1; j < i; j++) { if (inclr(p[j], ans)) continue; ans = C(mid(p[i], p[j]), dis(p[i], p[j]) * 0.5); for (int k = 1; k < j; k++) { if (inclr(p[k], ans)) continue; ans = get(p[i], p[j], p[k]); } } } printf("%.6f\n", ans.r); printf("%.6f %.6f\n", ans.o.x, ans.o.y); return 0;}
阅读全文
0 0
- Bzoj1336 Bzoj1337 最小圆覆盖
- bzoj1336&1337 最小圆覆盖
- [BZOJ1337]最小圆覆盖(最小圆覆盖)
- [BZOJ1336][Balkan2002]Alien最小圆覆盖(最小圆覆盖)
- bzoj1336: [Balkan2002]Alien最小圆覆盖&&1337: 最小圆覆盖
- 【Balkan2002】【BZOJ1336】Alien最小圆覆盖
- 【bzoj1336/1337/2823】最小圆覆盖
- BZOJ1336 [Balkan2002]Alien最小圆覆盖
- BZOJ1336&1337:[Balkan2002]Alien最小圆覆盖
- bzoj1337 最小圆覆盖 计算几何 解题报告
- bzoj1336/1337/2823 最小圆覆盖 计算几何
- 最小圆覆盖
- 最小圆覆盖
- 最小圆覆盖
- 最小圆覆盖
- 最小圆覆盖
- 最小圆覆盖
- 最小圆覆盖问题
- Java转dex,dex转smali,smali转Java
- 【java 基础知识复习】数组
- 全栈里面比如还包括服务器运维
- groovy TestRunnerInsertMysqlSingle
- MySQL升级
- Bzoj1336 Bzoj1337 最小圆覆盖
- Tensorflow -mofan1
- Oracle多库查询方法
- 最小费用最大流(模板)
- 关于博客文章的撰写
- 发送缓冲区、接受缓冲区、滑动窗口协议之间的关系
- 酒桌上如何说话?
- CClientDC
- 【MFC】获取系统当前时间