uva_10180_Rope Crisis in Ropeland!_WA
2016-05-19 11:40
375 查看
#include<iostream> #include<sstream> #include<string> #include<vector> #include<list> #include<set> #include<map> #include<stack> #include<queue> #include<algorithm> #include<numeric> #include<cmath> #include<cstdio> #include<cstdlib> #include<cstring> #pragma warning(disable:4996) using namespace std; const double eps = 1e-10; const double pi = acos(-1.0); int cmp(const double &x) { if (fabs(x) < eps) { return 0; } if (x > 0) { return 1; } return -1; } inline double sqr(const double &x) { return x*x; } class Point { public: double x, y; Point() {} Point(const double &a, const double &b) :x(a), y(b) {} void input() { cin >> x >> y; } friend Point operator+(const Point &a, const Point &b) { return Point(a.x + b.x, a.y + b.y); } friend Point operator-(const Point &a, const Point &b) { return Point(a.x - b.x, a.y - b.y); } friend bool operator==(const Point &a, const Point &b) { return cmp(a.x - b.x) == 0 && cmp(a.y - b.y) == 0; } friend Point operator*(const Point &a, const double &b) { return Point(a.x*b, a.y*b); } friend Point operator*(const double &a, const Point &b) { return Point(b.x*a, b.y*a); } friend Point operator/(const Point &a, const double &b) { return Point(a.x / b, a.y / b); } double norm() { return sqrt(sqr(x) + sqr(y)); } }; double det(const Point &a, const Point &b) { return a.x*b.y - a.y * b.x; } double dot(const Point &a, const Point &b) { return a.x*b.x + a.y * b.y; } double dist(const Point &a, const Point &b) { return (a - b).norm(); } Point rotate_point(const Point&p, const double &A) { double tx = p.x, ty = p.y; return Point(tx*cos(A) - ty*sin(A), tx*sin(A) + ty*cos(A)); } class Line { public: Point a, b; Line() {} Line(const Point&x, const Point &y) :a(x), b(y) {} Line point_make_line(const Point &a, const Point &b) { return Line(a, b); } }; double dist_point_segment(const Point &p, const Point &s, const Point &t) { if (cmp(dot(p - s, t - s))<0) { return (p - s).norm(); } if (cmp(dot(p - t, s - t)) < 0) { return (p - t).norm(); } return fabs(det(s - p, t - p) / dist(s, t)); } double dist_point_line(const Point &p, const Point &s, const Point &t) { return fabs((det(s - p, t - p)) / dist(s, t)); } void PointProjLine(const Point &p, const Point &s, const Point&t, Point &cp) { double r = dot((t - s), (p - s)) / dot(t - s, t - s); cp = s + r*(t - s); } bool PointOnSegment(const Point&p, const Point &s, const Point &t) { return cmp(det(p - s, t - s)) == 0 && cmp(dot(p - s, p - t)) <= 0; } bool parallel(const Line&a, const Line&b) { return !cmp(det(a.a - a.b, b.a - b.b)); } bool line_make_point(const Line &a, const Line&b, Point &res) { if (parallel(a, b)) return false; double s1 = det(a.a - b.a, b.b - b.a); double s2 = det(a.b - b.a, b.b - b.a); res = (s1*a.b - s2*a.a) / (s1 - s2); return true; } Line move_d(const Line &a, const double &len) { Point d = a.b - a.a; d = d / d.norm(); d = rotate_point(d, pi / 2); return Line(a.a + d*len, a.b + d*len); } bool comp_less(const Point &a, const Point &b) { return cmp(a.x - b.x) < 0 || cmp(a.x - b.x) == 0 && cmp(a.y - b.y) < 0; } class ConvexPolygon { public: vector<Point>point; ConvexPolygon(const int &n) { vector<Point>a(n); for (int i = 0; i < n; i++) { cin >> a[i].x >> a[i].y; } point.resize(2 * a.size() + 5); sort(a.begin(), a.end(), comp_less); a.erase(unique(a.begin(), a.end()), a.end()); int m = 0; for (int i = 0; i < a.size(); i++) { while (m > 1 && cmp(det(point[m - 1] - point[m - 2], a[i] - point[m - 2])) <= 0) { m--; } point[m++] = a[i]; } int k = m; for (int i = int(a.size()) - 2; i >= 0; i--) { while (m > k&&cmp(det(point[m - 1] - point[m - 2], a[i] - point[m - 2])) <= 0) { m--; } point[m++] = a[i]; } point.resize(m); if (a.size() > 1) { point.resize(m - 1); } } double perimeter() { double sum = 0.0; for (int i = 0; i < (int)point.size() - 1; i++) { sum += (point[i + 1] - point[i]).norm(); } sum += (point[0] - point[point.size() - 1]).norm(); return sum; } double area() { double sum = 0.0; for (int i = 0; i < (int)point.size() - 1; i++) { sum += det(point[i + 1], point[i]); } sum += det(point[0], point[point.size() - 1]); return sum / 2.0; } int PointInPolygon(const Point &t) { int num = 0, d1, d2, k, n = point.size(); point.push_back(point[0]); for (int i = 0; i < n; i++) { if (PointOnSegment(t, point[i], point[i + 1])) { return 2; } k = cmp(det(point[i + 1] - point[i], t - point[i])); d1 = cmp(point[i].y - t.y); d2 = cmp(point[i + 1].y - t.y); if (k > 0 && d1 <= 0 && d2>0) { num++; } if (k < 0 && d2 <= 0 && d1>0) { num--; } } point.pop_back(); return num != 0; } Point getMassCenter() { Point ans = Point(0, 0); if (cmp(area()) == 0) { return ans; } point.push_back(point[0]); for (int i = 0; i < point.size() - 1; i++) { ans = ans + (point[i] + point[i + 1])*det(point[i + 1], point[i]); } return ans / area() / 6.0; } }; int main() { //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); const Point origin = Point(0.0, 0.0); int T; cin >> T; while(T--) { double x1, y1, x2, y2, radius; while (cin >> x1 >> y1 >> x2 >> y2 >> radius) { Point point1(x1, y1), point2(x2, y2); if (cmp(dist_point_segment(origin,point1,point2) - radius) >=0 ) { printf("%.3lf\n", (point1 - point2).norm()); } else { double ans = sqrt(sqr(point1.norm()) - sqr(radius)) + sqrt(sqr(point2.norm()) - sqr(radius)) + radius*(pi - acos(radius / point1.norm()) - acos(radius / point2.norm())) ; printf("%.3lf\n", ans); } } } return 0; }
相关文章推荐
- Hadoop HDFS本地存储目录结构解析
- Apache2 MPM 模式了解
- LinuxShell日期遍历
- Hadoop
- 解决问题E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录
- Linux Shell初探02
- 《Hadoop基础教程》之初识Hadoop
- linux mac tree 命令 总结
- nginx配置子域名跳转到后端请求
- 基于OpenCV 图像分割
- linux安装多个MYSQL实例
- 在Ubuntu Linux下怎样安装QQ
- 实例讲解Nginx下的rewrite规则
- Tomcat 架构
- Tomcat 启动超时
- centos7下使用yum安装mysql
- Linux中zip压缩和unzip解压缩命令详解
- 开始学习马哥的linux
- CentOS6.5内核升级FATAL: Module scsi_wait_scan not found
- 转:从三层架构到MVC-MVP