题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1392
9 12 7 24 9 30 5 41 9 80 7 50 87 22 9 45 1 50 7 0
243.06
代码如下:
//#pragma warning (disable:4786) #include <cstdio> #include <cmath> #include <cstring> #include <string> #include <cstdlib> #include <climits> #include <ctype.h> #include <queue> #include <stack> #include <vector> #include <utility> #include <deque> #include <set> #include <map> #include <iostream> #include <algorithm> using namespace std; const double eps = 1e-9; //const double pi = atan(1.0)*4; const double pi = 3.1415926535897932384626; #define INF 1e18 //typedef long long LL; //typedef __int64 LL; const int MAXN = 1017; struct point { int x,y; } e[MAXN],res[MAXN]; //坐标点集,位于凸包上的点 bool cmp(point a,point b)//排序方法 { if(a.x == b.x) return a.y < b.y; return a.x < b.x; } int cross(point a,point b,point c)//叉积(向量积) { return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y); } double lenght(point a,point b)//距离 { return sqrt(1.0*(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } int convex(int n)//求凸包上的点 { sort(e,e+n,cmp); int m=0, i, k; //求得下凸包,逆时针 //已知凸包点m个,如果新加入点为i,则向量(m-2,i)必定要在(m-2,m-1)的逆时针方向才符合凸包的性质 //若不成立,则m-1点不在凸包上。 for(i = 0; i < n; i++) { while(m>1 && cross(res[m-1],e[i],res[m-2])<=0) m--; res[m++]=e[i]; } k = m; //求得上凸包 for(i = n-2; i >= 0; i--) { while(m>k && cross(res[m-1],e[i],res[m-2])<=0) m--; res[m++]=e[i]; } if(n > 1)//起始点重复。 m--; return m; } int main() { int n, m; while(~scanf("%d",&n) && n) { for(int i = 0; i < n; i++) scanf("%d%d",&e[i].x,&e[i].y); m = convex(n); double ans = 0; for(int i = 1; i < m; i++)//求凸包的周长 ans+=lenght(res[i],res[i-1]); ans+=lenght(res[m-1],res[0]);//首尾相接 if(n == 2) ans/=2.0; printf("%.2lf\n",ans); } return 0; }
hdu 1392 Surround the Trees(凸包果题),布布扣,bubuko.com
hdu 1392 Surround the Trees(凸包果题)
原文:http://blog.csdn.net/u012860063/article/details/38614107