传送门:
POJ:点击打开链接
HDU:点击打开链接
以下是POJ上的题;
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 29121 | Accepted: 9746 |
Description
Your task is to help poor Architect to save his head, by writing a program that will find the minimum possible length of the wall that he could build around the castle to satisfy King's requirements.
The task is somewhat simplified by the fact, that the King's castle has a polygonal shape and is situated on a flat ground. The Architect has already established a Cartesian coordinate system and has precisely measured the coordinates of all castle's vertices in feet.
Input
Next N lines describe coordinates of castle's vertices in a clockwise order. Each line contains two integer numbers Xi and Yi separated by a space (-10000 <= Xi, Yi <= 10000) that represent the coordinates of ith vertex. All vertices are different and the sides of the castle do not intersect anywhere except for vertices.
Output
Sample Input
9 100 200 400 300 400 300 300 400 300 400 400 500 400 500 200 350 200 200 200
Sample Output
1628
Hint
题意大致就是要你求将全部点包起来的那个面的最小周长, 以及另一个以L为半径圆的周长。。
用的是Andrew算法
</pre><pre name="code" class="cpp"> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<queue> #include<sstream> #include<cmath> using namespace std; #define f1(i, n) for(int i=0; i<n; i++) #define f2(i, m) for(int i=1; i<=m; i++) #define f3(i, n) for(int i=n; i>=0; i--) #define M 1005 #define PI 3.1415926 struct Point { double x, y; }; void sort(Point *p, int n) //依照x从小到大排序(假设x同样, 依照y从小到大排序) { Point temp; f1(i, n-1) f1(j, n-i-1) { if( (p[j].x > p[j+1].x) || (p[j].x==p[j+1].x && p[j].y>p[j+1].y) ) { temp = p[j]; p[j] = p[j+1]; p[j+1] = temp; } } } int cross(int x1, int y1, int x2, int y2) //看P[i]是否是在其内部。。</span></span> { if(x1*y2-x2*y1<=0) //叉积小于0,说明p[i]在当前前进方向的右边,因此须要从凸包中删除c[m-1],c[m-2]</span><span> return 0; else return 1; } double dis(Point a, Point b)//求两个凸包点之间的长度。。</span><span> { return sqrt( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) ); } int convexhull(Point *p, Point *c, int n) { int m = 0; f1(i, n)//下凸包</span><span> { while( m>1 && !cross(c[m-2].x-c[m-1].x, c[m-2].y-c[m-1].y, c[m-2].x-p[i].x, c[m-2].y-p[i].y) ) m--; c[m++] = p[i]; } int k = m; f3(i, n-2)//求上凸包</span><span> { while( m>k && !cross(c[m-2].x-c[m-1].x, c[m-2].y-c[m-1].y, c[m-2].x-p[i].x, c[m-2].y-p[i].y) ) m--; c[m++] = p[i]; } if(n>1) m--; return m; } int main() { Point a[M], p[M]; double sum; int n, r; while( cin>>n>>r ) { sum=0.0; f1(i, n) scanf("%lf %lf", &a[i].x, &a[i].y); sort (a, n); int m = convexhull(a, p, n); f2(i, m) sum+=dis( p[i], p[i-1] ); sum+=2*PI*r; printf("%.lf\n", sum); } return 0; }
我也不知道为什么。。我用lf用G++提交就WA, 用c++就AC。。看讨论区里也说用lf提交错。。把其改为f就对了。。可能G++的输出默觉得f把。。。~~(╯﹏╰)b
以下是HDU上AC的代码。。之所以贴出来, 是由于PE过一次。。要注意一下格式。。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<queue> #include<sstream> #include<cmath> using namespace std; #define f1(i, n) for(int i=0; i<n; i++) #define f2(i, m) for(int i=1; i<=m; i++) #define f3(i, n) for(int i=n; i>=0; i--) #define M 1005 #define PI 3.1415926 struct Point { double x, y; }; void sort(Point *p, int n) { Point temp; f1(i, n-1) f1(j, n-i-1) { if( (p[j].x > p[j+1].x) || (p[j].x==p[j+1].x && p[j].y>p[j+1].y) ) { temp = p[j]; p[j] = p[j+1]; p[j+1] = temp; } } } int cross(int x1, int y1, int x2, int y2) { if(x1*y2-x2*y1<=0) return 0; else return 1; } double dis(Point a, Point b) { return sqrt( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) ); } int convexhull(Point *p, Point *c, int n) { int m = 0; f1(i, n) { while( m>1 && !cross(c[m-2].x-c[m-1].x, c[m-2].y-c[m-1].y, c[m-2].x-p[i].x, c[m-2].y-p[i].y) ) m--; c[m++] = p[i]; } int k = m; f3(i, n-2) { while( m>k && !cross(c[m-2].x-c[m-1].x, c[m-2].y-c[m-1].y, c[m-2].x-p[i].x, c[m-2].y-p[i].y) ) m--; c[m++] = p[i]; } if(n>1) m--; return m; } int main() { Point a[M], p[M]; double sum; int t; while( cin>>t ) { while( t-- ) { sum=0.0; int n, r; cin>>n>>r; f1(i, n) scanf("%lf %lf", &a[i].x, &a[i].y); sort (a, n); int m = convexhull(a, p, n); f2(i, m) sum+=dis( p[i], p[i-1] ); sum+=2*PI*r; printf("%.lf\n", sum); if(t) printf("\n"); } } return 0; }