HDU1392:Surround the Trees(凸包问题)
Surround the Trees
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7164 Accepted Submission(s): 2738
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.
is less than 32767. Each pair is separated by blank.
Zero at line for number of trees terminates the input for your program.
9
12 7
24 9
30 5
41 9
80 7
50 87
22 9
45 1
50 7
0
243.06
题意是求将全部点围住的那个面积的最小周长。。可是要注意当仅仅有一个点时,也就输出0.00,当仅仅有两个点时。
。也就是两点间的距离。
。
这是凸包问题的入门题。。。(Orz) 用的是刘汝佳大白上的Andrew算法。。看他的代码实现。。简直丧心病狂。
。
Orz 。
。搞了好久的时间。。智商全然不够用。。
好吧。。由于是今天刚刚接触。
。所以一天也就弄了这么一道题。
。5555555.。
。泪流满面。。。
</pre><pre name="code" class="cpp"> #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<sstream>
#include<cmath> #define f1(i, n) for(int i=0; i<n; i++)
#define f2(i, m) for(int i=1; i<=m; i++) struct Point
{
double x, y;
}; void sort(Point *p, int n) //依照x从小到大排序(假设x同样, 依照y从小到大排序)
{
Point temp;
int i, j;
for(i=0; i<n-1; i++)
for(j=0; j<n-1-i; j++)
{
if(p[j].x>p[j+1].x)
{
temp = p[j];
p[j] = p[j+1];
p[j+1] = temp;
}
if(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]是否是在其内部。。
{
if(x1*y2-x2*y1<=0) //叉积小于0。说明p[i]在当前前进方向的右边。因此须要从凸包中删除c[m-1],c[m-2]
return 0;
else
return 1;
} int convexhull(Point *p, Point *c, int n)
{
int i,m=0,k;
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-1].x-p[i].x,c[m-1].y-p[i].y))
m--;
c[m++]=p[i];
}
k=m;
for(i=n-2; i>=0; i--) //求上凸包
{
while(m>k && !cross(c[m-2].x-c[m-1].x,c[m-2].y-c[m-1].y,c[m-1].x-p[i].x,c[m-1].y-p[i].y))
m--;
c[m++]=p[i];
}
if(n>1)
m--;
return m;
} 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 main()
{
Point a[105], p[105];
int n, i, m;
double lenth;
while(scanf("%d",&n) &&n)
{
f1(i, n)
scanf("%lf %lf",&a[i].x, &a[i].y); if(n==1)
{
printf("0.00\n");
continue;
}
else if(n==2)
{
printf("%.2lf\n", dis(a[0], a[1]));
continue;
}
sort(a, n);
m=convexhull(a, p, n);
lenth = 0;
f2(i, m)
lenth+=dis(p[i],p[i-1]);
printf("%.2lf\n",lenth);
}
return 0;
}
HDU1392:Surround the Trees(凸包问题)的更多相关文章
- HDU-1392 Surround the Trees,凸包入门!
Surround the Trees 此题讨论区里大喊有坑,原谅我没有仔细读题还跳过了坑点. 题意:平面上有n棵树,选一些树用绳子围成一个包围圈,使得所有的树都在这个圈内. 思路:简单凸包入门题,凸包 ...
- hdu1392 Surround the Trees 凸包
第一次做凸包,这道题要特殊考虑下,n=2时的情况,要除以二才行. 我是从最左边的点出发,每次取斜率最大的点,一直到最右边的点. 然后从最左边的点出发,每次取斜率最低的点,一直到最右边的点. #incl ...
- hdu 1392 Surround the Trees 凸包模板
Surround the Trees Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- hdu 1392 Surround the Trees (凸包)
Surround the Trees Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDU - 1392 Surround the Trees (凸包)
Surround the Trees:http://acm.hdu.edu.cn/showproblem.php?pid=1392 题意: 在给定点中找到凸包,计算这个凸包的周长. 思路: 这道题找出 ...
- hdu 1392 Surround the Trees 凸包裸题
Surround the Trees Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDUJ 1392 Surround the Trees 凸包
Surround the Trees Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- ACM学习历程—HDU1392 Surround the Trees(计算几何)
Description There are a lot of trees in an area. A peasant wants to buy a rope to surround all these ...
- HDU 1392 Surround the Trees (凸包周长)
题目链接:HDU 1392 Problem Description There are a lot of trees in an area. A peasant wants to buy a rope ...
- HDU 1392 Surround the Trees(凸包*计算几何)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1392 这里介绍一种求凸包的算法:Graham.(相对于其它人的解释可能会有一些出入,但大体都属于这个算 ...
随机推荐
- 39.C语言操作数据库
一.准备工作: sqlite3工具集:链接:https://pan.baidu.com/s/1mjufXZa 密码:2ui7 安装步骤: 打开如下文件夹,找到sqlite3.dll,并放入系统目录 2 ...
- #学习笔记#——JavaScript 数组部分编程(二)
2.移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果返回 function removeWithoutCopy(arr, item) { if(!A ...
- 完全背包模板 51Nod 1101
N元钱换为零钱,有多少不同的换法?币值包括1 2 5分,1 2 5角,1 2 5 10 20 50 100元. 例如:5分钱换为零钱,有以下4种换法: 1.5个1分 2.1个2分3个1分 3.2个2分 ...
- Android之——短信的备份与还原
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47091281 眼下,Android手机中的一些软件能够实现手机短信的备份与还原操作 ...
- R 语言下常用第三方库的说明
1. doBy 官方文档见 CRAN - Package doBy doBy 主要适用于以下操作: 1) Facilities for groupwise computations of summar ...
- 6.Windows 二进制文件 (.exe)安装--终端安装
转自:http://www.runoob.com/nodejs/nodejs-tutorial.html 32 位安装包下载地址 : http://nodejs.org/dist/v0.10.26/n ...
- beego的orm ,用的数据库sqlite3
测试 beego的orm ,用的数据库sqlite3 1 package main import ( "fmt" "github.com/astaxie/beego/or ...
- 一、Docker安装
原文:一.Docker安装 如果没有特殊要求关闭selinux!关闭selinux!关闭selinux!重要事情说三遍.这个坑活活让我重装了3.4遍系统才发现问题 本系列基于Centos系统安装,包括 ...
- 洛谷 P2616 [USACO10JAN]购买饲料II Buying Feed, II
洛谷 P2616 [USACO10JAN]购买饲料II Buying Feed, II https://www.luogu.org/problemnew/show/P2616 题目描述 Farmer ...
- POJ——T2271 Guardian of Decency
http://poj.org/problem?id=2771 Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 5932 A ...