HDUJ 1392 Surround the Trees 凸包

HDUJ 1392 Surround the Trees 凸包

大家好,又见面了,我是全栈君。

Surround the Trees

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

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.


HDUJ 1392 Surround the Trees 凸包

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

水平序的Andrew算法:

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

struct node
{
	double x,y;
}a[105],b[105];

double cmp(node n,node m)    //先比較X坐标,在比較Y坐标(从小到大)
{
	if(n.x != m.x)   
		return  n.x < m.x;
	else
		return  n.y < m.y;
}

double Cross(node a,node b,node c)     //计算叉积大小
{
	return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}

double dis(node a,node b)     //计算距离
{
	return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}

int CH(node* a,int n,node* b)
{
	sort(a,a+n,cmp);
	int m=0,i;
	for(i=0;i<n;i++)    //从左往右,选下边界
	{
		while(m > 1 && Cross(b[m-2],b[m-1],a[i]) < 0)
			m--;
		b[m++]=a[i];
	}


	int k=m;
	for(i=n-2;i>=0;i--)    //从右往左,选上边界
	{
		while(m > k && Cross(b[m-2],b[m-1],a[i]) < 0)
			m--;
		b[m++]=a[i];
	}
	
	if(n >1)  m--;
	return m;
}

int main()
{
	int n;
	while(cin>>n)
	{
		if(n==0)   break;
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));

		int i,j;
		for(i=0;i<n;i++)
		{
			cin>>a[i].x>>a[i].y;
		}
		
	//	cout<<CH(a,n,b)<<endl;     //输出所选点的总数
		if(n==1)   
			cout<<0.00<<endl;
		else  if(n==2)
			printf("%.2lf\n",dis(a[0],a[1]));	
		else
		{
			int m=CH(a,n,b);
			double s=0;
			for(i=1;i<m;i++)
				s+=dis(b[i-1],b[i]);
			s+=dis(b[0],b[m-1]);
			printf("%.2lf\n",s);
		}
	//	for(i=0;i<CH(a,n,b);i++)    //输出所选点的坐标
	//		cout<<b[i].x<<" "<<b[i].y<<endl;   

	}

	return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115357.html原文链接:https://javaforall.net

(0)
上一篇 2022年2月5日 下午4:00
下一篇 2022年2月5日 下午4:00


相关推荐

  • 400亿估值下的压力:智谱鏖战AI“六小虎”第一股

    400亿估值下的压力:智谱鏖战AI“六小虎”第一股

    2026年3月12日
    2
  • 小程序 flex_fly app

    小程序 flex_fly appflyio的使用在小程序中使用请求,只能使用原生的wx.request,如果想要向axios一样使用三方包,只能使用flyio,不然会报错,同时flyio是属于多种兼容的可以放心使用到多端。importFlyfrom’flyio/dist/npm/wx’constfly=newFly()consthost=process.env.NODE_ENV===”development”?”模拟地址”:”真实地址”fly.config.baseURL=hostfly.c

    2025年10月2日
    8
  • Matlab 多个版本的安装包下载、安装教程 + 多套数学建模视频教程

    Matlab 多个版本的安装包下载、安装教程 + 多套数学建模视频教程本文已迁移至:https://www.cnblogs.com/coco56/p/11205999.html如您对电脑操作不太熟悉,需要本人远程帮您安装软件,请查看:https://www.cnblogs.com/coco56/p/13385525.html

    2022年5月30日
    58
  • 什么是J2EE?[通俗易懂]

    什么是J2EE?[通俗易懂]什么是J2EE?J2EE是一种用来开发分布式企业软件应用系统的平台。JAVA语言从创生之日起,就获得了广泛接纳,经历了巨大的发展。越来越多的技术都成了JAVA平台的一部分,为了适应不同的需要业开发吃了很多全新的API和标准。最终,Sun公司联合了多家业界巨头,在开放的JAVA社区组织名义下,把所有与企业开发相关的标准,API整合起来,构成了J2EE平台。对于企业,J2EE平台由很多优势:

    2022年10月11日
    6
  • python面试常见问题-Python面试中最常见的25个问题

    python面试常见问题-Python面试中最常见的25个问题Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。Python是一个面向对象的解释型的交互式高级脚本语言。Python被设计成一种高可读性的语言,因为它大量地使用了英语中的单词作为关键字,而且不像其他语言使用标点符号构成复杂的语法结构,Python的语法结构非常少。Python是一种解释型语言:即Python程序是在运行时由解释器解释执行的,因而不用事先编…

    2022年10月19日
    5
  • unity3d 学习笔记(一)

    unity3d 学习笔记(一)

    2021年12月1日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号