POJ 1113 解题报告
2014-12-15 05:47
239 查看
为了以后搜索方便,注:这道题是凸包问题。用的是convex hull的扫描算法。
这道题实际上是个convex hull的问题。因为无论有些点凹进去多少,实际上是由那些convex hull上的凸点决定了最短的边界的形状。所以最终的围栏周长是convex hull的周长加上一个完整的园的周长(半径就是L)。
代码用的是我之前的代码:http://blog.csdn.net/thestoryofsnow/article/details/38516855
这道题实际上是个convex hull的问题。因为无论有些点凹进去多少,实际上是由那些convex hull上的凸点决定了最短的边界的形状。所以最终的围栏周长是convex hull的周长加上一个完整的园的周长(半径就是L)。
代码用的是我之前的代码:http://blog.csdn.net/thestoryofsnow/article/details/38516855
1113 | Accepted | 180K | 16MS | C++ | 2488B |
/* ID: thestor1 LANG: C++ TASK: poj1113 */ #include <iostream> #include <fstream> #include <cmath> #include <cstdio> #include <cstring> #include <limits> #include <string> #include <vector> #include <list> #include <set> #include <map> #include <queue> #include <stack> #include <algorithm> #include <cassert> using namespace std; class Point{ public: int x, y; Point() { Point(0, 0); } Point (int x, int y) { this->x = x; this->y = y; } bool operator <(const Point &p) const { return x < p.x || (x == p.x && y < p.y); } friend ostream& operator<<(ostream& os, const Point& p); }; ostream& operator<<(ostream& os, const Point& p) { os << p.x << "\t" << p.y; return os; } int cross(const Point &left, Point &middle, Point &right) { return (left.x - middle.x) * (right.y - middle.y) - (right.x - middle.x) * (left.y - middle.y); } int crossProduct(int x1, int y1, int x2, int y2) { return x1 * y2 - x2 * y1; } double dis(Point p1, Point p2) { return sqrt((double)((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y))); } double convexhull(std::vector<Point> &points) { sort(points.begin(), points.end()); // for (int i = 0; i < points.size(); ++i) // { // cout<<points[i]<<endl; // } std::vector<int> convexhull(2 * points.size()); int k = 0; for (int i = 0; i < points.size(); ++i) { while (k >= 2 && cross(points[convexhull[k - 2]], points[convexhull[k - 1]], points[i]) <= 0) { k--; } convexhull[k] = i; k++; } for (int i = points.size() - 2, t = k + 1; i >= 0; --i) { while (k >= t && cross(points[convexhull[k - 2]], points[convexhull[k - 1]], points[i]) <= 0) { k--; } convexhull[k] = i; k++; } convexhull.resize(k); // cout<<"convexhull:"<<endl; // for (int i = 0; i < convexhull.size(); ++i) // { // cout<<points[convexhull[i]]<<endl; // } double perimeter = 0.00; for (int i = 0; i < convexhull.size() - 1; ++i) { perimeter += dis(points[convexhull[i]], points[convexhull[i + 1]]); } // cout << "perimeter:" << perimeter << endl; return perimeter; } int main() { int N, L; scanf("%d%d", &N, &L); std::vector<Point> points(N); for (int i = 0; i < N; ++i) { scanf("%d%d", &points[i].x, &points[i].y); } double perimeter = convexhull(points); double circle = 2 * 3.141592653 * L; printf("%.0f\n", perimeter + circle); return 0; }
相关文章推荐
- poj 1113-Walls解题报告
- 【解题报告】 POJ 1113 Wall -- 求凸包周长
- poj解题报告——1970
- 【转】POJ试题分类 - 实时更新我所有的解题报告链接
- ACM POJ 2245Lotto解题报告
- 最小生成树 prim POJ 2349解题报告
- POJ - 1416 Shredding Company解题报告(dfs)
- POJ 3190 解题报告
- POJ 1469 解题报告
- POJ 3133 Manhattan Wiring 解题报告(插头DP)
- POJ 1562 解题报告
- POJ1298解题报告
- 【原】 POJ 1050 To the Max 求二维矩阵的最大子矩阵 解题报告
- 【原】 POJ 2159 Ancient Cipher 题意万岁 解题报告
- 【原】 POJ 3067 Japan 2D树状数组+逆序数 解题报告
- 2018.1.21【POJ - 1328】小岛与雷达解题报告(二维转一维,贪心)
- POJ1009解题报告
- poj2533解题报告
- POJ 2081 解题报告
- poj 2441Arrange the Bulls解题报告-状态压缩dp