关闭

HDOJ 1392 Surround the Trees (凸包)

195人阅读 评论(0) 收藏 举报
分类:

Surround the Trees

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9138    Accepted Submission(s): 3500


Problem Description
There are a lot of trees in an area. A peasant wants to buy a rope to surround all these trees. So at first he must know the minimal required length of the rope. However, he does not know how to calculate it. Can you help him?
The diameter and length of the trees are omitted, which means a tree can be seen as a point. The thickness of the rope is also omitted which means a rope can be seen as a line.



There are no more than 100 trees.
 

Input
The input contains one or more data sets. At first line of each input data set is number of trees in this data set, it is followed by series of coordinates of the trees. Each coordinate is a positive integer pair, and each integer is less than 32767. Each pair is separated by blank.

Zero at line for number of trees terminates the input for your program.
 

Output
The minimal length of the rope. The precision should be 10^-2.
 

Sample Input
9 12 7 24 9 30 5 41 9 80 7 50 87 22 9 45 1 50 7 0
 

Sample Output
243.06



普通的凸包,只不过在n=2的时候有一个特判,因为不超过3的时候不存在首尾相连的情况,即不会存在一个封闭的图形,如果按照普通凸包来算就会将那一条线段重复计算,所以特判。。


ac代码:

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#define fab(a) (a)>0?(a):(-a)
#define LL long long
#define MAXN 55000
#define mem(x) memset(x,0,sizeof(x))
#define INF 0xfffffff 
#define PI acos(-1.0)
using namespace std;
struct s
{
	double x,y;
}list[MAXN];
int stack[MAXN],top;
double dis(s aa,s bb)
{
	return sqrt((aa.x-bb.x)*(aa.x-bb.x)+(aa.y-bb.y)*(aa.y-bb.y));
}
int cross(s p0,s p1,s p2)
{
    return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);
}
bool cmp(s aa,s bb)
{
	int num=cross(list[0],aa,bb);
	if(num>0) return true;
	else if(num==0&&dis(list[0],aa)<dis(list[0],bb)) return true;
	else return false;
}
void graham(int n)
{
	int i;
	if(n==1) {top=0;stack[0]=0;}
	if(n==2) {top=1;stack[0]=0;stack[1]=1;}
	if(n>2)
	{
		for(i=0;i<2;i++)
		stack[i]=i;
		top=1;
		for(i=2;i<n;i++)
        {
            while(top>0&&cross(list[stack[top-1]],list[stack[top]],list[i])<=0) top--;
            top++;
            stack[top]=i;
        }  
	}
}
int main()
{
	int n,i;
	while(scanf("%d",&n)!=EOF,n)
	{
		
		s low;
		scanf("%lf%lf",&list[0].x,&list[0].y);
		low.x=list[0].x,low.y=list[0].y;
		int k=0;
		for(i=1;i<n;i++)
		{
			scanf("%lf%lf",&list[i].x,&list[i].y);
			if(((low.y==list[i].y)&&(low.x>list[i].x))||low.y>list[i].y)
			{
				low.x=list[i].x;
				low.y=list[i].y;
				k=i;
			}
		}
		if(n==2)
		{
			printf("%.2lf\n",dis(list[0],list[1]));
			continue;
		}
		list[k]=list[0];
		list[0]=low;
		sort(list+1,list+n,cmp);
		graham(n);
		double ans=0;
		for(i=0;i<top;i++)
		{
			ans+=dis(list[stack[i]],list[stack[i+1]]);
		}
		ans+=dis(list[stack[0]],list[stack[top]]);
		//printf("%lf\n",ans);
		printf("%.2lf\n",ans);
	}
	return 0;
}


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

HDU 1392 Surround the Trees(计算几何,求凸包周长)

Surround the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe...
  • ChildrenLi
  • ChildrenLi
  • 2017-06-28 22:24
  • 115

杭电OJ(HDOJ)1392题:Surround the Trees(凸包问题)

题意: 一个土地上有N棵树,农夫想把所有的树用一根绳子绕起来,给出第棵的坐标(X,Y),求出绳子的最短长度。树至少有1棵,至多的100棵,坐标均为整数且不超过 32767。输出的最短长度保留两位小数。...
  • u014174811
  • u014174811
  • 2014-12-01 18:30
  • 709

hdu 1392 Surround the Trees(求取凸包并求凸包的周长)

Surround the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe...
  • qq_24451605
  • qq_24451605
  • 2015-04-14 15:01
  • 314

HDU 2202 最大三角形(求凸包中最大三角形面积)

题目链接: HDU 2202 最大三角形 题意: 给出n个点,求最大三角形面积。 分析: 先求出凸包顶点,因为最大三角形的顶点一定都是凸包顶点。 接下来就暴力枚举所有凸包顶点(复杂度是凸包...
  • Ramay7
  • Ramay7
  • 2016-04-20 00:11
  • 867

HDU 1693 Eat the Trees (插头DP,闭合路径)

之前对于经典骨牌的轮廓线DP的位压缩,采用的如下形状的位压缩: 当ij判断放置哪种骨牌时,是根据k4k3k2k1k0判断的,在填入了骨牌后,转移到的状态也是由k3k2k1k0ij这样排布的,就是原...
  • csuhoward
  • csuhoward
  • 2015-04-28 15:01
  • 1093

(ssl1720)Surround the Trees(凸包问题,附带新手教程)

Surround the Trees 无责任乱译┑( ̄Д  ̄)┍: 光头强想种树了树再砍,又怕熊孩子(不是孩子了吧)来捣乱,并打算用绳子把他种的树围起来。但由于他要回家撸猫,便留下了多组数据,...
  • SSL_lzx
  • SSL_lzx
  • 2018-01-13 14:02
  • 50

hdu 1392(凸包周长)

Surround the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other...
  • baidu_34638825
  • baidu_34638825
  • 2017-04-28 20:34
  • 57

POJ 1392(凸包的周长)

求凸包的长度,先求出凸包的外围的点(求法上篇说过)。 然后求每每两个点的之间的距离就可以了。 如果求凸包的面积就可以使用。 公式是: s1=x1*y2-y1*x2; S=s1+s2+...
  • KJBU2
  • KJBU2
  • 2015-07-18 11:17
  • 496

hdu 1392 凸包问题

经典算法,百度上都能找到。 就说一个特殊情况,只有两个点的时候,要进行特判,直接输出两点距离,否则会输出两倍。 当然我认为就是应该输出两倍的,可是题目这样也没办法。#include #includ...
  • Techmonster
  • Techmonster
  • 2015-11-26 20:37
  • 259

hdu 1392凸包周长

//用的自己的计算几何模板,不过比较慢嘿嘿 //要注意只有一个点和两个点 //Computational Geometry //by kevin_samuel(fenice) Soochow Un...
  • Kevin_Samuel
  • Kevin_Samuel
  • 2013-08-03 11:59
  • 874
    时刻记住--never give up
    人生如棋,吾愿为卒,吾行虽慢,谁曾见吾后退半步!
    个人资料
    • 访问:195327次
    • 积分:8863
    • 等级:
    • 排名:第2502名
    • 原创:723篇
    • 转载:3篇
    • 译文:0篇
    • 评论:27条