Surround the Trees

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

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
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
//#include <algorithm>
namespace Geometry {
class point {
public:
double x, y;
point() {}
point(const point &p): x(p.x), y(p.y) {}
point(double a, double b): x(a), y(b) {}
point operator + (const point & p)const {
point ret;
ret.x = x + p.x, ret.y = y + p.y;
return ret;
}
point operator - (const point & p)const {
point ret;
ret.x = x - p.x, ret.y = y - p.y;
return ret;
}
//dot product
double operator * (const point & p)const {
return x * p.x + y * p.y;
}
//cross product
double operator ^ (const point & p)const {
return x * p.y - p.x * y;
}
bool operator < (const point & p)const {
if (fabs(x - p.x) < 1e-) {
return y < p.y;
}
return x < p.x;
}
double mold() {
return sqrt(x * x + y * y);
}
};
double cp(point a, point b, point o) {
return (a - o) ^ (b - o);
}
class line {
public:
point A, B;
line() {}
line(point a, point b): A(a), B(b) {}
bool IsLineCrossed(const line &l)const {
point v1, v2;
double c1, c2;
v1 = B - A, v2 = l.A - A;
c1 = v1 ^ v2;
v2 = l.B - A;
c2 = v1 ^ v2;
if (c1 * c2 >= ) {
return false;
}
v1 = l.B - l.A, v2 = A - l.A;
c1 = v1 ^ v2;
v2 = B - l.A;
c2 = v1 ^ v2;
if (c1 * c2 >= ) {
return false;
}
return true;
}
};
int Graham(point * p, point * s, int n) {
std::sort(p, p + n);
int top, m;
s[] = p[];
s[] = p[];
top = ;
for (int i = ; i < n; i++) { //从前往后扫
while (top > && cp(p[i], s[top], s[top - ]) >= ) {
top--;
}
s[++top] = p[i];
}
m = top;
s[++top] = p[n - ];
for (int i = n - ; i >= ; i--) { //从后往前扫
while (top > m && cp(p[i], s[top], s[top - ]) >= ) {
top--;
}
s[++top] = p[i];
}
return top;
}
}
//using namespace Geometry;
using namespace Geometry;
point p[], s[];
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
int n;
while (scanf("%d", &n) != EOF) {
if (n == ) {
break;
}
for (int i = ; i < n; i++) {
scanf("%lf%lf", &p[i].x, &p[i].y);
}
int cnt = ;
for (int i = ; i < n; i++) //去掉重复的点
if (fabs(p[i].x - p[cnt].x) > 1e- || fabs(p[i].y - p[cnt].y) > 1e-) {
p[++cnt] = p[i];
}
cnt++;
if (cnt == ) {
printf("0.00\n");
continue;
} else if (cnt == ) {
printf("%.2lf\n", (p[] - p[]).mold());
continue;
}
int top = Graham(p, s, cnt);
double ans = ;
for (int i = ; i < top - ; i++) {
ans += (s[i + ] - s[i]).mold();
}
ans += (s[top - ] - s[]).mold();
printf("%.2lf\n", ans);
}
return ;
}

Surround the Trees[HDU1392]的更多相关文章

  1. 【计算几何初步-凸包-Jarvis步进法。】【HDU1392】Surround the Trees

    [科普]什么是BestCoder?如何参加? Surround the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65 ...

  2. HDU-1392 Surround the Trees,凸包入门!

    Surround the Trees 此题讨论区里大喊有坑,原谅我没有仔细读题还跳过了坑点. 题意:平面上有n棵树,选一些树用绳子围成一个包围圈,使得所有的树都在这个圈内. 思路:简单凸包入门题,凸包 ...

  3. HDU1392:Surround the Trees(凸包问题)

    Surround the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  4. Surround the Trees(凸包求周长)

    Surround the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  5. Surround the Trees(凸包)

    Surround the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  6. hdu 1392 Surround the Trees 凸包裸题

    Surround the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  7. hdu 1392 Surround the Trees 凸包模板

    Surround the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  8. HDUJ 1392 Surround the Trees 凸包

    Surround the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  9. hdu 1392:Surround the Trees(计算几何,求凸包周长)

    Surround the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

随机推荐

  1. Java中面向对象三大特性之——继承

    继承的概述 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那一个类即可. 现实生活中继承:子承父业,用来描述事物之间的关系 代码中继承:就是用 ...

  2. Django逻辑关系

    title: Django学习笔记 subtitle: 1. Django逻辑关系 date: 2018-12-14 10:17:28 --- Django逻辑关系 本文档主要基于Django2.2官 ...

  3. OAuth网络协议

    一.应用场景 为了理解OAuth的适用场合,让我举一个假设的例子. 有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来.用户为了使用该服务,必须让"云冲 ...

  4. 查看表之间的关系 需要在eas中的商业分析-扩展报表中心-报表平台下的语义层方案管理

    查看表之间的关系 需要在eas中的商业分析-扩展报表中心-报表平台下的语义层方案管理

  5. 【剑指Offer】31、从1到n整数中1出现的次数

      题目描述:   求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他 ...

  6. Coloring Flame Graphs: Code Hues

    转自:http://www.brendangregg.com/blog/2017-07-30/coloring-flamegraphs-code-type.html I recently improv ...

  7. constraint、index、view(day04)

    回顾: 1.sql99中的表连接 select 字段列表 from 左表 {[inner]|{left|right|full} [outer]} join 右表 on 关联条件; 集合操作 union ...

  8. [bzoj3291] Alice与能源计划 (二分图最大匹配)

    传送门 Description 在梦境中,Alice来到了火星.不知为何,转眼间Alice被任命为火星能源部长,并立刻面临着一个严峻的考验.为 了方便,我们可以将火星抽象成平面,并建立平面直角坐标系. ...

  9. 学习Linux服务的方法

    1.服务的概述:名字.功能.特点.原理.端口号 2.安装 3.配置文件的位置 4.服务器启动.关闭的脚本,查看端口 5.此服务的使用方法 6.修改配置文件,案例部署 7.排错调优

  10. windows 下关于nginx的操作

    在nginx安装目录下操作 1.启动:start nginx 2.停止:① nginx.exe -s stop ②nginx.exe -s quit   注:stop是快速停止nginx,可能并不保存 ...